渗透测试 | web缓存投毒
字数 1129 2025-08-10 08:28:18

Web缓存投毒攻击详解

1. Web缓存基础概念

Web缓存是服务器为了提高响应速度,在各地节点设置的缓存服务器(如CDN),这些服务器会缓存后端服务器的内容。当收到相同请求时,直接返回缓存内容,减轻服务器负荷。

关键概念

  • 缓存键(Cache Key):决定请求是否"相同"的关键特征参数,通常包括:

    • Host头
    • 请求行
    • Referer
    • Query参数
    • 特定消息头
  • 非缓存键(Unkeyed):不参与缓存判断的其他请求字段

2. Web缓存投毒原理

当页面内容根据非缓存键的值动态生成时,攻击者可以通过操纵这些非缓存键来污染缓存内容,使后续用户接收到被污染的响应。

攻击条件

  1. 目标页面被缓存服务器缓存
  2. 页面存在根据非缓存键动态生成的内容

3. 攻击示例

基本攻击流程

  1. 攻击者发送包含恶意payload的特殊请求
  2. 服务器处理请求并生成响应(包含恶意内容)
  3. 响应被缓存服务器缓存
  4. 其他用户请求相同资源时,接收到被污染的缓存内容

X-Forwarded-Host投毒示例

正常请求:

GET / HTTP/1.1
Host: test.com
X-Forwarded-Host: www.demo.com

正常响应:

<a href='www.demo.com'></a>

恶意请求:

GET / HTTP/1.1
Host: test.com
X-Forwarded-Host: #'></a><script>alert(1)</script>

被污染的响应:

<a href='#'></a><script>alert(1)</script></a>

4. 攻击危害

  • 影响范围广:一旦缓存被污染,会影响所有请求该资源的用户
  • 可实现多种攻击:
    • XSS攻击
    • 窃取用户敏感信息
    • 篡改页面内容
    • 重定向到恶意网站

5. 检测工具

Param Miner (Burp Suite插件)

用于发现影响页面响应的非缓存键:

  1. 右键目标请求
  2. 选择 Extensions > Param Miner > Guess Params > Guess headers
  3. 使用默认配置即可扫描

6. 实际利用步骤

实验环境

PortSwigger提供的Web缓存投毒实验靶场

攻击案例1:非缓存键导致的投毒

  1. 抓取首页数据包
  2. 修改X-Forwarded-Host值为恶意内容(如baidu.com
  3. 观察页面变化
  4. 确认该头为影响响应的非缓存键
  5. 构造恶意payload并多次发送使缓存生效(观察x-cache: hit
  6. 刷新页面验证攻击效果

攻击案例2:Cookie导致的缓存投毒

  1. 识别影响响应的Cookie参数
  2. 构造恶意Cookie值
  3. 发送请求污染缓存
  4. 验证攻击效果

7. 防御措施

  1. 严格定义缓存键:确保所有动态内容依赖的参数都包含在缓存键中
  2. 净化用户输入:对所有动态生成内容进行严格过滤
  3. 限制缓存范围:对敏感页面禁用缓存
  4. 缓存验证:实现缓存内容的签名验证机制
  5. 监控异常:监控缓存服务器的异常响应模式

8. 总结

Web缓存投毒是一种危害性大、影响范围广的攻击方式,利用缓存机制和动态内容生成的特性,通过操纵非缓存键来污染缓存内容。防御关键在于严格控制缓存键定义和输入净化。

Web缓存投毒攻击详解 1. Web缓存基础概念 Web缓存是服务器为了提高响应速度,在各地节点设置的缓存服务器(如CDN),这些服务器会缓存后端服务器的内容。当收到相同请求时,直接返回缓存内容,减轻服务器负荷。 关键概念 缓存键(Cache Key) :决定请求是否"相同"的关键特征参数,通常包括: Host头 请求行 Referer Query参数 特定消息头 非缓存键(Unkeyed) :不参与缓存判断的其他请求字段 2. Web缓存投毒原理 当页面内容根据非缓存键的值动态生成时,攻击者可以通过操纵这些非缓存键来污染缓存内容,使后续用户接收到被污染的响应。 攻击条件 目标页面被缓存服务器缓存 页面存在根据非缓存键动态生成的内容 3. 攻击示例 基本攻击流程 攻击者发送包含恶意payload的特殊请求 服务器处理请求并生成响应(包含恶意内容) 响应被缓存服务器缓存 其他用户请求相同资源时,接收到被污染的缓存内容 X-Forwarded-Host投毒示例 正常请求 : 正常响应 : 恶意请求 : 被污染的响应 : 4. 攻击危害 影响范围广:一旦缓存被污染,会影响所有请求该资源的用户 可实现多种攻击: XSS攻击 窃取用户敏感信息 篡改页面内容 重定向到恶意网站 5. 检测工具 Param Miner (Burp Suite插件) 用于发现影响页面响应的非缓存键: 右键目标请求 选择 Extensions > Param Miner > Guess Params > Guess headers 使用默认配置即可扫描 6. 实际利用步骤 实验环境 PortSwigger提供的Web缓存投毒实验靶场 攻击案例1:非缓存键导致的投毒 抓取首页数据包 修改 X-Forwarded-Host 值为恶意内容(如 baidu.com ) 观察页面变化 确认该头为影响响应的非缓存键 构造恶意payload并多次发送使缓存生效(观察 x-cache: hit ) 刷新页面验证攻击效果 攻击案例2:Cookie导致的缓存投毒 识别影响响应的Cookie参数 构造恶意Cookie值 发送请求污染缓存 验证攻击效果 7. 防御措施 严格定义缓存键 :确保所有动态内容依赖的参数都包含在缓存键中 净化用户输入 :对所有动态生成内容进行严格过滤 限制缓存范围 :对敏感页面禁用缓存 缓存验证 :实现缓存内容的签名验证机制 监控异常 :监控缓存服务器的异常响应模式 8. 总结 Web缓存投毒是一种危害性大、影响范围广的攻击方式,利用缓存机制和动态内容生成的特性,通过操纵非缓存键来污染缓存内容。防御关键在于严格控制缓存键定义和输入净化。