CORS(跨域资源共享)安全漏洞与防护(进阶篇)
字数 1851 2025-11-13 10:12:37

CORS(跨域资源共享)安全漏洞与防护(进阶篇)

知识点描述
CORS是一种W3C标准,允许服务器声明哪些外部源(域名、协议、端口)可以访问其资源。错误配置会导致敏感数据泄露或未授权操作。进阶篇将深入探讨复杂场景下的漏洞模式、预检请求绕过、凭据泄露等风险。

1. CORS基础机制回顾

  • 同源策略限制:浏览器默认禁止跨域读取响应,但<script><img>等标签的跨域请求可发送(响应内容不可读)。
  • CORS核心头字段
    • Access-Control-Allow-Origin(ACAO):指定允许访问的源(如https://example.com或通配符*)。
    • Access-Control-Allow-Credentials(ACAC):为true时允许携带Cookie等凭据。
    • Access-Control-Allow-Methods:允许的HTTP方法(如POST、PUT)。
  • 预检请求:对非简单请求(如带自定义头或Content-Type非application/x-www-form-urlencoded),浏览器先发送OPTIONS请求验证权限。

2. 常见漏洞模式与攻击场景

  • 场景1:过度宽松的ACAO配置

    • 问题:设置ACAO: *且同时设置ACAC: true。此时浏览器会拒绝请求(安全机制)。但若仅设置ACAO: *,攻击者可在恶意网站读取无凭据保护的敏感数据。
    • 攻击示例
      // 恶意网站https://attacker.com的代码
      fetch('https://api.victim.com/user/data')
        .then(response => response.text())
        .then(data => exfiltrate(data)); // 窃取数据
      
  • 场景2:动态Origin反射漏洞

    • 问题:服务器盲目将Origin请求头值反射到ACAO头,且未验证来源合法性。
    • 攻击步骤
      1. 诱骗用户访问https://attacker.com
      2. 在该页面发起跨域请求至https://api.victim.com,请求头自动包含Origin: https://attacker.com
      3. 服务器返回ACAO: https://attacker.com,浏览器判定合法,返回数据。
  • 场景3:预检请求验证缺陷

    • 问题:服务器对OPTIONS请求的验证不严格,但实际请求处理存在漏洞。
    • 示例
      • 服务器允许任意源的OPTIONS请求(返回ACAO: *)。
      • 实际POST请求检查Origin,但攻击者可通过Flash或旧浏览器绕过预检(如IE9)。

3. 进阶攻击技术:子域接管与DNS重绑定

  • 子域漏洞链
    • 假设api.victim.com设置ACAO: *.victim.com
    • 攻击者注册子域evil.victim.com,并托管恶意页面,即可读取api.victim.com的数据。
  • DNS重绑定攻击
    1. 用户访问evil.com,页面内请求api.victim.com
    2. 恶意DNS服务器首次解析api.victim.com返回攻击者控制的IP(通过TTL控制)。
    3. 浏览器发送请求后,DNS迅速重绑定到真实api.victim.com的IP,绕过同源检查。

4. 防护措施详解

  • 严格校验Origin头
    • 维护白名单列表,拒绝非预期源(如正则匹配^https://([a-z0-9]+\.)?victim\.com$)。
    • 避免使用正则漏洞(如.*\.victim.com可能匹配attacker.victim.com.evil.com)。
  • 避免动态反射Origin:除非业务需公开API,否则固定ACAO为可信源。
  • 凭据保护
    • 若需ACAC: true,则ACAO不能为*,必须指定具体源。
    • 结合SameSite Cookie属性限制跨站请求。
  • 预检请求强化
    • 对OPTIONS请求实施与主请求相同的认证/授权检查。
    • 限制允许的方法和头部,避免冗余权限(如Access-Control-Max-Age不宜过长)。
  • 监控异常CORS请求:记录Origin头异常(如包含特殊字符或非预期域名)的访问日志。

5. 实战检测方法

  • 手工测试
    1. 修改请求中的Origin头,观察ACAO是否反射或宽松匹配。
    2. 尝试通配符测试(如将Origin改为nullattacker.comvictim.com.attacker.com)。
  • 工具辅助:使用Burp Suite的"CORS Scanner"扩展或自定义脚本批量检测。

通过以上步骤,可系统理解CORS漏洞的深层成因及防护关键,避免在复杂业务场景中误配置。

CORS(跨域资源共享)安全漏洞与防护(进阶篇) 知识点描述 CORS是一种W3C标准,允许服务器声明哪些外部源(域名、协议、端口)可以访问其资源。错误配置会导致敏感数据泄露或未授权操作。进阶篇将深入探讨复杂场景下的漏洞模式、预检请求绕过、凭据泄露等风险。 1. CORS基础机制回顾 同源策略限制 :浏览器默认禁止跨域读取响应,但 <script> 、 <img> 等标签的跨域请求可发送(响应内容不可读)。 CORS核心头字段 : Access-Control-Allow-Origin (ACAO):指定允许访问的源(如 https://example.com 或通配符 * )。 Access-Control-Allow-Credentials (ACAC):为 true 时允许携带Cookie等凭据。 Access-Control-Allow-Methods :允许的HTTP方法(如POST、PUT)。 预检请求 :对非简单请求(如带自定义头或Content-Type非 application/x-www-form-urlencoded ),浏览器先发送OPTIONS请求验证权限。 2. 常见漏洞模式与攻击场景 场景1:过度宽松的ACAO配置 问题 :设置 ACAO: * 且同时设置 ACAC: true 。此时浏览器会拒绝请求(安全机制)。但若仅设置 ACAO: * ,攻击者可在恶意网站读取无凭据保护的敏感数据。 攻击示例 : 场景2:动态Origin反射漏洞 问题 :服务器盲目将 Origin 请求头值反射到ACAO头,且未验证来源合法性。 攻击步骤 : 诱骗用户访问 https://attacker.com 。 在该页面发起跨域请求至 https://api.victim.com ,请求头自动包含 Origin: https://attacker.com 。 服务器返回 ACAO: https://attacker.com ,浏览器判定合法,返回数据。 场景3:预检请求验证缺陷 问题 :服务器对OPTIONS请求的验证不严格,但实际请求处理存在漏洞。 示例 : 服务器允许任意源的 OPTIONS 请求(返回 ACAO: * )。 实际POST请求检查Origin,但攻击者可通过Flash或旧浏览器绕过预检(如IE9)。 3. 进阶攻击技术:子域接管与DNS重绑定 子域漏洞链 : 假设 api.victim.com 设置 ACAO: *.victim.com 。 攻击者注册子域 evil.victim.com ,并托管恶意页面,即可读取 api.victim.com 的数据。 DNS重绑定攻击 : 用户访问 evil.com ,页面内请求 api.victim.com 。 恶意DNS服务器首次解析 api.victim.com 返回攻击者控制的IP(通过TTL控制)。 浏览器发送请求后,DNS迅速重绑定到真实 api.victim.com 的IP,绕过同源检查。 4. 防护措施详解 严格校验Origin头 : 维护白名单列表,拒绝非预期源(如正则匹配 ^https://([a-z0-9]+\.)?victim\.com$ )。 避免使用正则漏洞(如 .*\.victim.com 可能匹配 attacker.victim.com.evil.com )。 避免动态反射Origin :除非业务需公开API,否则固定ACAO为可信源。 凭据保护 : 若需ACAC: true,则ACAO不能为 * ,必须指定具体源。 结合SameSite Cookie属性限制跨站请求。 预检请求强化 : 对OPTIONS请求实施与主请求相同的认证/授权检查。 限制允许的方法和头部,避免冗余权限(如 Access-Control-Max-Age 不宜过长)。 监控异常CORS请求 :记录Origin头异常(如包含特殊字符或非预期域名)的访问日志。 5. 实战检测方法 手工测试 : 修改请求中的Origin头,观察ACAO是否反射或宽松匹配。 尝试通配符测试(如将Origin改为 null 、 attacker.com 、 victim.com.attacker.com )。 工具辅助 :使用Burp Suite的"CORS Scanner"扩展或自定义脚本批量检测。 通过以上步骤,可系统理解CORS漏洞的深层成因及防护关键,避免在复杂业务场景中误配置。