【由浅入深_打牢基础】WEB缓存投毒(上)
字数 1729 2025-08-06 21:48:45
WEB缓存投毒技术详解
0x01 WEB缓存投毒基础概念
什么是WEB缓存投毒
WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当用户发起请求时,请求会先经过缓存检查,如果缓存中不存在该请求的响应,后端才会处理请求并将响应添加到缓存中。之后的用户如果发送等效请求,会直接从缓存中获取响应。
缓存键(Cache Key)机制
后端通过"缓存键"来判断两个用户的请求是否等效:
- 缓存键:预先定义的请求头中的一些键作为缓存键,只要这些键的值相同,后端就认为两个请求等效
- 非缓存键:头部中除缓存键外的其他键
WEB缓存投毒依赖于非缓存键,因为:
- 缓存键通常不能改变(否则无法与其他用户等效)
- 页面必须存在根据非缓存键的值动态生成的内容
攻击示例
GET / HTTP/1.1
Host: test.com
X-Forwarded-Host: #'></a><script>alert(1)</script> //
响应变为:
<a href='#'></a><script>alert(1)</script> //'></a>
0x02 漏洞利用技术详解
2.1 带有未键标头的Web缓存投毒
利用工具:Burp Suite的Param Miner插件
步骤:
- 使用Param Miner探测影响响应的非缓存键(右键请求包 > Guess headers)
- 发现
X-Forwarded-Host标头会影响响应 - 构造恶意请求:
GET / HTTP/1.1 Host: target.com X-Forwarded-Host: attacker.com - 确保请求不被缓存(添加随机参数)
- 验证缓存是否命中(查看
X-Cache响应头)
关键点:
- 必须投毒根页面(/)而非特定产品页面
- 使用
X-Forwarded-Host控制页面中的链接或脚本来源
2.2 使用未键入的cookie进行Web缓存投毒
利用条件:
- Cookie中存在未作为缓存键的参数
- 响应内容会根据该cookie值动态生成
攻击步骤:
- 发现
fehostcookie参数影响响应 - 构造恶意cookie:
fehost=someString"%2Balert(1)%2B"someString - 投毒根页面
- 等待其他用户访问触发XSS
2.3 具有多个标头的Web缓存投毒
技术要求:
- 需要同时利用多个非缓存标头
- 常见组合:
X-Forwarded-Host+X-Forwarded-Scheme
攻击流程:
- 使用Param Miner探测发现
X-Forwarded-Scheme - 结合
X-Forwarded-Host构造请求:GET / HTTP/1.1 Host: target.com X-Forwarded-Host: attacker.com X-Forwarded-Scheme: http - 利用重定向机制控制JS文件加载路径
- 投毒
/resources/js/tracking.js等静态资源
2.4 使用未知标头的有针对性的Web缓存投毒
特殊条件:
Vary响应头中包含User-Agent- 需要获取目标用户的UA信息
攻击步骤:
- 发现
X-Host标头影响响应 - 通过留言板等XSS收集目标用户UA:
- 构造匹配UA的投毒请求:
GET / HTTP/1.1 Host: target.com X-Host: attacker.com/js/malicious.js User-Agent: [目标UA] - 投毒后等待特定用户访问
2.5 通过无键查询字符串导致Web缓存投毒
特征:
- URL查询参数不作为缓存键
- 参数值直接影响响应内容
攻击方法:
- 发现参数可构造XSS:
/?param=<script>alert(1)</script> - 直接投毒根页面
- 其他用户访问任何等效请求都会触发恶意脚本
2.6 通过未键入查询参数的Web缓存投毒
关键技术:
- 部分参数被排除在缓存键外(如UTM参数)
- UTM参数通常用于分析,不作为缓存依据
攻击流程:
- 使用Param Miner探测非缓存参数
- 发现
utm_content等参数不影响缓存 - 构造投毒请求:
/?normal_param=value&utm_content=<script>alert(1)</script> - 投毒后所有访问
/?normal_param=value的用户都会受害
2.7 参数隐藏技术
高级技巧:
- 利用参数解析顺序和分号特性
- 结合缓存键与非缓存键参数
攻击步骤:
- 发现JS文件带参数:
/js/tracker.js?callback=setCountryCookie - 测试参数是否缓存键:
- 修改
callback值 → 缓存未命中 → 是缓存键
- 修改
- 添加非缓存参数:
/js/tracker.js?callback=setCountryCookie;utm_content=xxx - 构造复杂投毒:
/js/tracker.js?callback=setCountryCookie;utm_content=;callback=alert(1) - 响应中包含恶意代码但使用原始缓存键
防御措施
- 严格定义缓存键:确保所有用户输入相关参数都作为缓存键
- 限制动态内容:避免使用不可信的头/参数生成响应
- 缓存净化:对缓存内容进行安全检查
- Vary头谨慎使用:避免过度依赖User-Agent等易变头
- 参数白名单:限制可接受的查询参数和头
工具推荐
- Param Miner:Burp插件,自动探测非缓存键
- Burp Scanner:检测缓存投毒漏洞
- 自定义脚本:自动化测试参数组合
通过深入理解这些技术和案例,安全人员可以更好地发现和防御WEB缓存投毒漏洞。