渗透测试 | web缓存投毒
字数 1129 2025-08-10 08:28:18
Web缓存投毒攻击详解
1. Web缓存基础概念
Web缓存是服务器为了提高响应速度,在各地节点设置的缓存服务器(如CDN),这些服务器会缓存后端服务器的内容。当收到相同请求时,直接返回缓存内容,减轻服务器负荷。
关键概念
-
缓存键(Cache Key):决定请求是否"相同"的关键特征参数,通常包括:
- Host头
- 请求行
- Referer
- Query参数
- 特定消息头
-
非缓存键(Unkeyed):不参与缓存判断的其他请求字段
2. Web缓存投毒原理
当页面内容根据非缓存键的值动态生成时,攻击者可以通过操纵这些非缓存键来污染缓存内容,使后续用户接收到被污染的响应。
攻击条件
- 目标页面被缓存服务器缓存
- 页面存在根据非缓存键动态生成的内容
3. 攻击示例
基本攻击流程
- 攻击者发送包含恶意payload的特殊请求
- 服务器处理请求并生成响应(包含恶意内容)
- 响应被缓存服务器缓存
- 其他用户请求相同资源时,接收到被污染的缓存内容
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插件)
用于发现影响页面响应的非缓存键:
- 右键目标请求
- 选择
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缓存投毒是一种危害性大、影响范围广的攻击方式,利用缓存机制和动态内容生成的特性,通过操纵非缓存键来污染缓存内容。防御关键在于严格控制缓存键定义和输入净化。