Web缓存投毒攻击详解
字数 1522 2025-11-20 02:35:06

Web缓存投毒攻击详解

1. 攻击描述
Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理、负载均衡器等),将恶意构造的HTTP响应存储到缓存中。当其他正常用户后续请求相同资源时,缓存服务器会直接返回被污染的恶意响应,而非从原始服务器获取安全内容。这种攻击的影响范围广泛,可以导致XSS、敏感信息泄露、权限提升等后果。

2. 攻击原理与前提条件

  • 缓存键(Cache Key):缓存服务器通过"缓存键"判断是否命中缓存。通常包含HTTP方法、URL路径、查询参数、Host头等部分,但可能忽略某些头部(如X-Forwarded-Host)。
  • 投毒条件
    1. 存在可被缓存的页面(如静态资源、公开API响应)
    2. 缓存服务器错误配置了缓存键(未包含所有用户输入相关字段)
    3. 攻击者能注入恶意内容到响应中(通过未过滤的头部或参数)

3. 攻击步骤分解
步骤1:识别缓存行为

  • 使用工具(如Burp Suite)观察HTTP响应头中的缓存指示符:
    • Cache-Control: public, max-age=3600(明确可缓存)
    • X-Cache: Hit(确认缓存命中)
  • 测试不同请求参数/头部是否影响缓存键:
    • 修改查询参数(如?id=1?id=2),观察是否返回不同内容
    • 添加无关头部(如X-Forwarded-Host: evil.com),检查是否被缓存忽略

步骤2:寻找未键化输入点

  • 检查哪些头部或参数未被纳入缓存键但被后端处理:
    • Host头变异:尝试Host: evil.com,观察响应是否包含该域名
    • X-Forwarded-*系列头部:如X-Forwarded-HostX-Forwarded-Scheme
    • 其他自定义头部:如User-AgentReferer(某些应用会将其内容嵌入响应)

步骤3:构造恶意响应

  • 通过未键化输入点注入恶意负载:
    • XSS投毒:通过X-Forwarded-Host注入JavaScript代码:
      请求:
      GET / HTTP/1.1
      Host: example.com
      X-Forwarded-Host: evil.com"><script>alert(1)</script>
      
      响应(被缓存):
      <script src="https://evil.com"><script>alert(1)</script>/lib.js">
      
    • 开放重定向投毒:利用X-Forwarded-Scheme强制HTTPS重定向到恶意站点:
      X-Forwarded-Scheme: http  // 触发重定向到https://evil.com
      

步骤4:触发缓存存储

  • 确保恶意请求被缓存:
    • 观察响应头是否有Age: 0(表示新缓存)
    • 多次重复请求,确认出现X-Cache: Hit

步骤5:传播恶意缓存

  • 诱导用户访问同一URL(通过社交工程或正常流量),用户将收到污染内容。

4. 实际案例:缓存键不匹配攻击

  • 场景:缓存键仅包含URL路径,但应用根据User-Agent返回不同内容。
  • 攻击
    1. 发送带恶意User-Agent的请求:User-Agent: <svg onload=alert(1)>
    2. 应用将User-Agent嵌入JSON响应:{"ua": "<svg onload=alert(1)>"}
    3. 缓存服务器存储该响应(因路径相同)
    4. 其他用户请求同一路径时,收到被污染的JSON(可能触发DOM XSS)

5. 防御措施

  • 严格配置缓存键:将所有用户可控字段(如Host、关键头部)纳入缓存键
  • 净化用户输入:后端对头部和参数进行过滤编码
  • 限制缓存范围:对动态内容设置Cache-Control: privateno-store
  • 缓存验证:使用Vary头明确指定影响响应的头部(如Vary: User-Agent
  • 监控异常:部署WAF检测异常的头部内容与缓存命中模式

6. 进阶技巧:基于时间的投毒

  • 利用缓存过期机制,在特定时间(如流量低谷期)投毒,最大化影响范围。
  • 结合其他漏洞(如请求走私)将投毒请求"隐藏"在正常流量中。
Web缓存投毒攻击详解 1. 攻击描述 Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理、负载均衡器等),将恶意构造的HTTP响应存储到缓存中。当其他正常用户后续请求相同资源时,缓存服务器会直接返回被污染的恶意响应,而非从原始服务器获取安全内容。这种攻击的影响范围广泛,可以导致XSS、敏感信息泄露、权限提升等后果。 2. 攻击原理与前提条件 缓存键(Cache Key) :缓存服务器通过"缓存键"判断是否命中缓存。通常包含HTTP方法、URL路径、查询参数、Host头等部分,但可能忽略某些头部(如X-Forwarded-Host)。 投毒条件 : 存在可被缓存的页面(如静态资源、公开API响应) 缓存服务器错误配置了缓存键(未包含所有用户输入相关字段) 攻击者能注入恶意内容到响应中(通过未过滤的头部或参数) 3. 攻击步骤分解 步骤1:识别缓存行为 使用工具(如Burp Suite)观察HTTP响应头中的缓存指示符: Cache-Control: public, max-age=3600 (明确可缓存) X-Cache: Hit (确认缓存命中) 测试不同请求参数/头部是否影响缓存键: 修改查询参数(如 ?id=1 → ?id=2 ),观察是否返回不同内容 添加无关头部(如 X-Forwarded-Host: evil.com ),检查是否被缓存忽略 步骤2:寻找未键化输入点 检查哪些头部或参数未被纳入缓存键但被后端处理: Host头变异 :尝试 Host: evil.com ,观察响应是否包含该域名 X-Forwarded-* 系列头部 :如 X-Forwarded-Host 、 X-Forwarded-Scheme 其他自定义头部 :如 User-Agent 、 Referer (某些应用会将其内容嵌入响应) 步骤3:构造恶意响应 通过未键化输入点注入恶意负载: XSS投毒 :通过 X-Forwarded-Host 注入JavaScript代码: 开放重定向投毒 :利用 X-Forwarded-Scheme 强制HTTPS重定向到恶意站点: 步骤4:触发缓存存储 确保恶意请求被缓存: 观察响应头是否有 Age: 0 (表示新缓存) 多次重复请求,确认出现 X-Cache: Hit 步骤5:传播恶意缓存 诱导用户访问同一URL(通过社交工程或正常流量),用户将收到污染内容。 4. 实际案例:缓存键不匹配攻击 场景 :缓存键仅包含URL路径,但应用根据 User-Agent 返回不同内容。 攻击 : 发送带恶意User-Agent的请求: User-Agent: <svg onload=alert(1)> 应用将User-Agent嵌入JSON响应: {"ua": "<svg onload=alert(1)>"} 缓存服务器存储该响应(因路径相同) 其他用户请求同一路径时,收到被污染的JSON(可能触发DOM XSS) 5. 防御措施 严格配置缓存键 :将所有用户可控字段(如Host、关键头部)纳入缓存键 净化用户输入 :后端对头部和参数进行过滤编码 限制缓存范围 :对动态内容设置 Cache-Control: private 或 no-store 缓存验证 :使用 Vary 头明确指定影响响应的头部(如 Vary: User-Agent ) 监控异常 :部署WAF检测异常的头部内容与缓存命中模式 6. 进阶技巧:基于时间的投毒 利用缓存过期机制,在特定时间(如流量低谷期)投毒,最大化影响范围。 结合其他漏洞(如请求走私)将投毒请求"隐藏"在正常流量中。