Web缓存投毒攻击详解
字数 1522 2025-11-20 02:35:06
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(某些应用会将其内容嵌入响应)
- Host头变异:尝试
步骤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
- XSS投毒:通过
步骤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)
- 发送带恶意User-Agent的请求:
5. 防御措施
- 严格配置缓存键:将所有用户可控字段(如Host、关键头部)纳入缓存键
- 净化用户输入:后端对头部和参数进行过滤编码
- 限制缓存范围:对动态内容设置
Cache-Control: private或no-store - 缓存验证:使用
Vary头明确指定影响响应的头部(如Vary: User-Agent) - 监控异常:部署WAF检测异常的头部内容与缓存命中模式
6. 进阶技巧:基于时间的投毒
- 利用缓存过期机制,在特定时间(如流量低谷期)投毒,最大化影响范围。
- 结合其他漏洞(如请求走私)将投毒请求"隐藏"在正常流量中。