CORS跨域资源共享漏洞详解与防御指南
一、CORS基础概念
1.1 什么是CORS
CORS(Cross-Origin Resource Sharing)是一种浏览器安全机制,允许Web应用程序从不同源加载所需的Web资源。由于浏览器的同源策略限制,Web应用程序只能访问与其自身源相同的资源,因此需要CORS来解决跨域资源访问的问题。
1.2 同源策略(Same-Origin Policy)
同源策略用于限制应用程序之间的资源共享,确保一个应用里的资源只能被本应用的资源所访问。同源是指协议、域名、端口三个都相同。
同源示例(以http://test.com/a/123.html为基准):
| 源URL | 是否同源 | 不同之处 |
|---|---|---|
| http://test.com/a/asd.html | 同源 | 路径不同 |
| http://test.com/abcvb/123.html | 同源 | 路径不同 |
| https://test.com/a/1234.html | 不同源 | 协议不同 |
| http://test.com:88/a/1234.html | 不同源 | 端口不同 |
| http://bbb.test.com/a/1234.html | 不同源 | 域名不同(子域名不算同源) |
二、CORS相关HTTP头部
CORS通过HTTP头进行控制,主要涉及以下头部:
- Access-Control-Allow-Origin:授权访问的源站
- Access-Control-Allow-Credentials:是否允许发送Cookie等凭据信息
- Access-Control-Allow-Methods:授权访问的HTTP方法
- Access-Control-Allow-Headers:授权访问的自定义头部
三、CORS漏洞产生原因
当目标站点配置不当,没有对请求源的域做严格限制,导致任意源都可以访问时,就存在CORS跨域漏洞问题。
四、CORS漏洞主要类型
4.1 未正确设置Access-Control-Allow-Origin
如果Access-Control-Allow-Origin头未正确设置,攻击者可以构造特定请求,绕过同源策略获取数据。
4.2 Access-Control-Allow-Origin设置为*
设置为*表示所有站点都可以访问该资源,可能导致安全问题。攻击者可以伪造HTTP请求头中Origin字段的值获取数据。
4.3 未正确设置Access-Control-Allow-Credentials
如果未正确设置该头部,攻击者可以伪造HTTP请求头中的Origin和Cookie字段,绕过同源策略获取数据。
4.4 使用不安全的HTTP方法和头部
如果未正确设置Access-Control-Allow-Methods和Access-Control-Allow-Headers,攻击者可以构造特定请求,使用不安全的HTTP方法和头部获取数据。
4.5 CSRF与CORS结合
由于CORS的存在,攻击者可以利用CSRF漏洞发起跨域请求,绕过同源策略获取数据。
五、CORS漏洞危害
- 窃取用户敏感信息:如cookie等身份认证信息
- 执行未授权操作:如POST请求修改数据、DELETE请求删除数据
- 数据篡改:通过跨域POST请求篡改数据库数据
- 资源耗尽:发起大量跨域请求占用服务器资源
六、CORS漏洞检测方法
使用BurpSuite抓包,添加Origin: http://www.attacker.com进行测试:
-
存在漏洞:
Access-Control-Allow-Origin: https://www.attacker.com Access-Control-Allow-Credentials: true或
Access-Control-Allow-Origin: null Access-Control-Allow-Credentials: true -
不存在漏洞:
Access-Control-Allow-Origin: Null // Null必须是小写才存在漏洞 Access-Control-Allow-Credentials: true或
Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true
七、CORS漏洞复现
7.1 Java复现
参考:https://mp.weixin.qq.com/s/PSU8T-IO3mAz4MEVvAeUug中的part3
7.2 PHP复现
参考:https://mp.weixin.qq.com/s/ViSR-l41Z9qsazxI2MAhTA
使用dorabox靶场,搭建方式参考:https://mp.weixin.qq.com/s/juseXiuKATSTRUwoMjLI-Q
八、CORS工具化检测
-
Burp插件:
- JSONP-Hunter:https://github.com/p1g3/JSONP-Hunter
- 自动搜集CORS与JSONP请求
-
扫描工具:
- CORS-SCAN:https://github.com/p1g3/CORS-SCAN
- 使用:
python3 cors_test.py url_file.txt
-
Xray扫描:
- 可扫描这类漏洞,但需人工判断响应数据是否敏感
-
POC生成工具:
- PoCBox:https://github.com/0verSp4ce/PoCBox
- Docker启动:
docker container run -d -p 8088:80 registry.cn-hangzhou.aliyuncs.com/pocbox/pocbox:1.0
九、防御措施
-
严格限制Access-Control-Allow-Origin:
- 避免使用通配符
* - 明确指定允许的域名
- 避免使用通配符
-
谨慎使用Access-Control-Allow-Credentials:
- 当需要发送凭据时,确保Origin严格限制
-
限制HTTP方法和头部:
- 明确指定允许的方法和头部
-
使用CSRF Token:
- 防止CSRF与CORS结合攻击
-
服务器端验证:
- 验证Origin头是否在允许列表中
- 避免仅依赖客户端验证