Web缓存投毒(Web Cache Poisoning)漏洞与防护
字数 1075 2025-11-22 22:56:48

Web缓存投毒(Web Cache Poisoning)漏洞与防护

描述
Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理等),将恶意内容注入缓存中,使其他用户访问同一URL时接收到有害响应。这种攻击的危害在于可大规模传播XSS、资源劫持甚至权限提升漏洞,且难以追踪源头。其核心原理是利用缓存服务器对HTTP请求的解析差异或业务逻辑缺陷,使恶意响应被错误地缓存并分发。

解题过程循序渐进讲解

  1. 理解Web缓存的工作机制

    • 缓存服务器通过缓存键(Cache Key)判断请求是否命中缓存。缓存键通常包含URL、请求方法、部分头部(如Host)。
    • 若请求命中缓存,则直接返回缓存内容;否则,将请求转发给后端服务器,并将响应缓存起来。
    • 关键问题:缓存服务器与后端服务器对请求的解析可能不一致(例如,对头部字段的优先级处理不同),导致攻击者可通过精心构造请求污染缓存。
  2. 识别可投毒的缓存键组件

    • 攻击者需找到未被纳入缓存键但会影响后端响应的“无键”字段(Unkeyed Headers/Parameters)。例如:
      • X-Forwarded-HostX-Origin-URL等代理头部。
      • 查询参数如utm_contentversion等业务参数。
    • 测试方法:在请求中添加可疑字段,观察响应是否变化。若响应变化但缓存未失效,说明该字段可能被用于投毒。
  3. 构造恶意响应并触发缓存

    • 通过无键字段控制后端生成恶意内容(如修改重定向URL、注入JavaScript代码)。
    • 确保响应可被缓存:需满足缓存条件(如缓存服务器配置为缓存特定状态码、Content-Type等)。
    • 示例攻击链
      • 请求:GET /index.js?cb=legit HTTP/1.1
        Host: example.com
        X-Forwarded-Host: attacker.com
      • 后端返回:document.domain = 'attacker.com'; // 恶意代码
      • 缓存服务器误将此响应与/index.js?cb=legit的缓存键绑定,后续用户访问同一URL时会执行恶意代码。
  4. 防护措施

    • 缓存键完整性:确保所有影响响应的字段(如Host、查询参数)均纳入缓存键。
    • 禁用危险头部:在后端过滤或忽略非常规头部(如X-Forwarded-Host)。
    • 缓存验证:使用Vary头部明确指定影响响应的字段,但需注意某些CDN可能忽略复杂Vary规则。
    • 最小化缓存范围:对动态内容设置较短缓存时间或禁用缓存。
Web缓存投毒(Web Cache Poisoning)漏洞与防护 描述 Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理等),将恶意内容注入缓存中,使其他用户访问同一URL时接收到有害响应。这种攻击的危害在于可大规模传播XSS、资源劫持甚至权限提升漏洞,且难以追踪源头。其核心原理是利用缓存服务器对HTTP请求的解析差异或业务逻辑缺陷,使恶意响应被错误地缓存并分发。 解题过程循序渐进讲解 理解Web缓存的工作机制 缓存服务器通过缓存键(Cache Key)判断请求是否命中缓存。缓存键通常包含URL、请求方法、部分头部(如 Host )。 若请求命中缓存,则直接返回缓存内容;否则,将请求转发给后端服务器,并将响应缓存起来。 关键问题 :缓存服务器与后端服务器对请求的解析可能不一致(例如,对头部字段的优先级处理不同),导致攻击者可通过精心构造请求污染缓存。 识别可投毒的缓存键组件 攻击者需找到未被纳入缓存键但会影响后端响应的“无键”字段(Unkeyed Headers/Parameters)。例如: X-Forwarded-Host 、 X-Origin-URL 等代理头部。 查询参数如 utm_content 、 version 等业务参数。 测试方法 :在请求中添加可疑字段,观察响应是否变化。若响应变化但缓存未失效,说明该字段可能被用于投毒。 构造恶意响应并触发缓存 通过无键字段控制后端生成恶意内容(如修改重定向URL、注入JavaScript代码)。 确保响应可被缓存:需满足缓存条件(如缓存服务器配置为缓存特定状态码、Content-Type等)。 示例攻击链 : 请求: GET /index.js?cb=legit HTTP/1.1 Host: example.com X-Forwarded-Host: attacker.com 后端返回: document.domain = 'attacker.com'; // 恶意代码 缓存服务器误将此响应与 /index.js?cb=legit 的缓存键绑定,后续用户访问同一URL时会执行恶意代码。 防护措施 缓存键完整性 :确保所有影响响应的字段(如Host、查询参数)均纳入缓存键。 禁用危险头部 :在后端过滤或忽略非常规头部(如 X-Forwarded-Host )。 缓存验证 :使用 Vary 头部明确指定影响响应的字段,但需注意某些CDN可能忽略复杂 Vary 规则。 最小化缓存范围 :对动态内容设置较短缓存时间或禁用缓存。