CORS(跨域资源共享)安全漏洞与防护(实战进阶篇)
字数 1222 2025-11-19 18:35:27

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

知识点描述
CORS(跨域资源共享)是一种基于HTTP头的机制,允许服务器声明哪些外部源(域名、协议、端口)可以访问其资源。配置不当会导致严重安全风险,例如将Access-Control-Allow-Origin(ACAO)设置为通配符*或动态信任任意来源,可能泄露敏感数据或允许未授权操作。本专题深入分析实际场景中的错误配置模式及防护方案。

逐步讲解

  1. CORS核心机制回顾

    • 浏览器发起跨域请求时,自动添加Origin头(如Origin: https://evil.com)。
    • 服务器通过Access-Control-Allow-Origin(ACAO)响应头指定允许的源。若为*,表示允许所有源;若为具体域名,则仅允许该源。
    • 对于携带凭证(Cookie/Auth头)的请求,服务器需设置Access-Control-Allow-Credentials: true,且ACAO不能为*
  2. 常见漏洞场景分析

    • 场景1:动态ACAO信任任意Origin

      • 漏洞代码示例(Node.js):
        app.use((req, res) => {
          const origin = req.headers.origin;
          res.setHeader('Access-Control-Allow-Origin', origin); // 直接回显请求的Origin
          res.setHeader('Access-Control-Allow-Credentials', 'true');
        });
        
      • 风险:攻击者可伪造任意Origin获取数据,例如通过恶意网站发起跨域请求窃取用户信息。
    • 场景2:宽松的正则匹配

      • 错误配置:检查Origin是否包含example.com(如允许attacker-example.com)。
      • 风险:子域名或相似域名可越权访问。
    • 场景3:预检请求(Preflight)缺失验证

      • 复杂请求(如Content-Type非简单值)会先发OPTIONS预检请求。若服务器对OPTIONS请求缺乏验证,可能绕过限制。
  3. 攻击案例演示

    • 假设API端点https://api.target.com/userinfo返回用户敏感数据,且配置为动态ACAO。
    • 攻击者在https://evil.com部署以下代码:
      <script>
        fetch('https://api.target.com/userinfo', { 
          credentials: 'include'  // 携带用户Cookie
        })
        .then(response => response.json())
        .then(data => sendToAttacker(data));
      </script>
      
    • 用户访问evil.com时,浏览器自动携带Target域的Cookie发起请求,服务器返回数据并被攻击者捕获。
  4. 防护方案

    • 严格校验Origin:使用白名单机制,仅允许可信域名。示例代码:
      const allowedOrigins = ['https://app.target.com', 'https://admin.target.com'];
      app.use((req, res) => {
        const origin = req.headers.origin;
        if (allowedOrigins.includes(origin)) {
          res.setHeader('Access-Control-Allow-Origin', origin);
          res.setHeader('Access-Control-Allow-Credentials', 'true');
        }
      });
      
    • 避免动态信任:禁止直接反射Origin,尤其当请求含凭证时。
    • 限制方法/头:通过Access-Control-Allow-MethodsAccess-Control-Allow-Headers缩小允许范围。
    • 预检请求加固:对OPTIONS请求实施与主请求相同的认证逻辑。
  5. 进阶防护技巧

    • Vary头设置:添加Vary: Origin避免缓存污染。
    • 敏感接口本地访问限制:通过检查Origin是否为nullfile://协议,阻止本地恶意文件访问。
    • 监控异常Origin:日志记录非法Origin请求,及时发现攻击试探。

通过以上步骤,可系统化解决CORS配置导致的安全问题,平衡跨域需求与安全性。

CORS(跨域资源共享)安全漏洞与防护(实战进阶篇) 知识点描述 CORS(跨域资源共享)是一种基于HTTP头的机制,允许服务器声明哪些外部源(域名、协议、端口)可以访问其资源。配置不当会导致严重安全风险,例如将 Access-Control-Allow-Origin (ACAO)设置为通配符 * 或动态信任任意来源,可能泄露敏感数据或允许未授权操作。本专题深入分析实际场景中的错误配置模式及防护方案。 逐步讲解 CORS核心机制回顾 浏览器发起跨域请求时,自动添加 Origin 头(如 Origin: https://evil.com )。 服务器通过 Access-Control-Allow-Origin (ACAO)响应头指定允许的源。若为 * ,表示允许所有源;若为具体域名,则仅允许该源。 对于携带凭证(Cookie/Auth头)的请求,服务器需设置 Access-Control-Allow-Credentials: true ,且ACAO不能为 * 。 常见漏洞场景分析 场景1:动态ACAO信任任意Origin 漏洞代码示例(Node.js): 风险 :攻击者可伪造任意Origin获取数据,例如通过恶意网站发起跨域请求窃取用户信息。 场景2:宽松的正则匹配 错误配置:检查Origin是否包含 example.com (如允许 attacker-example.com )。 风险 :子域名或相似域名可越权访问。 场景3:预检请求(Preflight)缺失验证 复杂请求(如Content-Type非简单值)会先发OPTIONS预检请求。若服务器对OPTIONS请求缺乏验证,可能绕过限制。 攻击案例演示 假设API端点 https://api.target.com/userinfo 返回用户敏感数据,且配置为动态ACAO。 攻击者在 https://evil.com 部署以下代码: 用户访问 evil.com 时,浏览器自动携带Target域的Cookie发起请求,服务器返回数据并被攻击者捕获。 防护方案 严格校验Origin :使用白名单机制,仅允许可信域名。示例代码: 避免动态信任 :禁止直接反射Origin,尤其当请求含凭证时。 限制方法/头 :通过 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 缩小允许范围。 预检请求加固 :对OPTIONS请求实施与主请求相同的认证逻辑。 进阶防护技巧 Vary头设置 :添加 Vary: Origin 避免缓存污染。 敏感接口本地访问限制 :通过检查 Origin 是否为 null 或 file:// 协议,阻止本地恶意文件访问。 监控异常Origin :日志记录非法Origin请求,及时发现攻击试探。 通过以上步骤,可系统化解决CORS配置导致的安全问题,平衡跨域需求与安全性。