首页/安全/渗透测试与安全评估速查/Web 缓存投毒验证思路
常见漏洞验证121 条

Web 缓存投毒验证思路

缓存键未包含关键输入时,攻击者可控内容可能被缓存并回放给其他用户;验证关注非缓存键输入是否影响响应内容。

缓存投毒在查什么

共享缓存按「缓存键」决定把响应存给谁。如果某个输入没有进入缓存键、却会影响响应内容,攻击者就可能让缓存保存一份被污染的内容,随后回放给其他用户——从 XSS 到跳转劫持都可能由此产生。风险特点是波及面大:一个标记被缓存,可能影响大量真实用户。因此验证方式必须极度克制:用无害标记、间隔请求观察,并在结束前按客户流程清理。

基本信息

缓存键要素路径、查询参数、Host、部分请求头
关注输入未进入缓存键但影响响应内容的请求头(如各类转发头)
识别方式响应头中的缓存标识与命中指示(如 age、x-cache)
风险等级共享缓存场景下波及面大,需要严格限定窗口
前置条件先与客户确认缓存清理方式与验证窗口

典型使用场景

  • CDN 前置站点的评估项,重点是缓存键覆盖是否完整
  • 解释「不同用户看到相同异常内容」这类现象
  • 评估缓存层与源站对同一请求的理解是否一致
  • 为跨站脚本与跳转类问题评估放大效应
  • 修复验证:确认缓存键已包含关键输入或缓存已旁路

验证思路

验证思路
# 1. 识别缓存层与缓存键构成
curl -sI https://example.com/ | grep -Ei 'age|x-cache|cache-control|via'
# 2. 选一个未进入缓存键但影响响应内容的头,用无害标记请求两次
curl -s -H 'X-Forwarded-Host: marker.example' https://example.com/ | head -3
curl -s https://example.com/ | head -3      # 第二次若命中标记,说明被缓存
# 3. 用独立浏览器会话复核,避免本机会话干扰
# 4. 结束后等待缓存自然过期,或按客户流程清理;全程控制请求次数

现象与判断

现象含义处置
第二次请求命中注入标记污染内容被缓存按共享缓存影响定级,并说明已清理
仅本机会话可见标记本地缓存而非共享缓存区分本地与共享缓存,影响面不同
响应头显示不缓存该路径未进入缓存记录为已核查
标记在过期后消失缓存按预期过期记录生命周期,便于评估影响时长
验证前必须与客户确认缓存清理方式:标记若长期驻留,会影响真实用户,后果远超测试本身。
把正常缓存命中当作投毒成功是常见误判:判定标准是「注入的标记被缓存并回放给其他会话」,而不是响应被缓存这件事本身。

易错点

  • 验证后未清理缓存:标记内容影响真实用户,属于典型的测试副作用
  • 把正常缓存命中当投毒成功:定级错误会让客户对结论产生怀疑
  • 用真实用户可访问的路径做大范围探测:请求量与污染面都不可控
  • 未区分本地缓存与共享缓存:只有共享缓存才构成跨用户影响

数据来源与参考

  • OWASP WSTG(Cache Poisoning)
  • RFC 9111(HTTP 缓存)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌