【由浅入深_打牢基础】WEB缓存投毒(上)
字数 1266 2025-08-12 11:33:35
WEB缓存投毒技术详解
1. WEB缓存投毒基础概念
1.1 基本定义
WEB缓存投毒是指攻击者利用缓存机制将有害的HTTP响应提供给用户的技术。当用户发起请求时,请求会先经过缓存检查,如果缓存中不存在该请求的响应,才会向后端服务器请求并将响应添加到缓存中。
1.2 缓存键(Cache Key)机制
- 缓存键:预先定义的请求头中的一些键作为缓存键,只要这些缓存键的值相同,后端就认为两个请求是等效的
- 非缓存键:头部中除缓存键外的其他键,是WEB缓存投毒的关键依赖点
- Vary头:指示哪些请求头字段被用作缓存键
1.3 攻击条件
- 存在可被利用的非缓存键
- 页面内容会根据非缓存键的值动态生成
2. 攻击技术详解
2.1 利用未键标头投毒
攻击步骤:
- 使用Param Miner插件探测影响响应的非缓存键(如X-Forwarded-Host)
- 构造恶意请求,在非缓存键中注入payload
- 确保请求不被缓存(可添加随机参数)
- 验证缓存是否被污染
示例:
GET / HTTP/1.1
Host: test.com
X-Forwarded-Host: #'></a><script>alert(1)</script>
2.2 利用未键入的Cookie投毒
特点:
- Cookie通常不作为缓存键
- 需要找到影响响应的Cookie参数
示例:
GET / HTTP/1.1
Host: test.com
Cookie: fehost=someString"%2Balert(1)%2B"someString
2.3 多标头组合投毒
技术要点:
- 需要同时利用多个非缓存键(如X-Forwarded-Host和X-Forwarded-Scheme)
- 组合效果可能导致重定向或资源加载变化
利用场景:
- 通过控制重定向目标实现JS文件投毒
- 修改资源加载路径指向恶意服务器
2.4 针对性投毒(基于User-Agent)
特殊要求:
- 当Vary头包含User-Agent时,需要匹配目标UA
- 可通过XSS或其他方式获取目标UA
攻击流程:
- 发现X-Host等可影响JS加载路径的非缓存键
- 通过评论等交互功能获取目标UA
- 构造匹配UA的恶意请求进行投毒
2.5 无键查询字符串投毒
特点:
- 查询参数不作为缓存键
- 可直接修改参数值实现投毒
示例:
GET /?param=<script>alert(1)</script> HTTP/1.1
Host: test.com
2.6 未键入查询参数投毒
技术要点:
- 部分参数被排除在缓存键外(如utm_content)
- UTM相关参数通常不作为缓存键
攻击方法:
- 识别非缓存键参数
- 通过该参数传递恶意payload
- 确保主要参数保持不变
2.7 参数隐藏技术
高级技巧:
- 利用参数解析特性隐藏恶意payload
- 通过分号等特殊字符构造复合参数
示例:
GET /js/tracking.js?callback=setCountryCookie;utm_content=xxx;callback=alert(1) HTTP/1.1
3. 防御措施
3.1 服务器端防御
- 严格定义缓存键,包含所有影响响应的参数
- 对动态内容谨慎使用缓存
- 实施输入验证和输出编码
3.2 缓存配置建议
- 避免缓存包含用户特定数据的响应
- 对敏感操作禁用缓存
- 定期清除缓存
4. 工具推荐
- Param Miner:Burp Suite插件,用于探测非缓存键和隐藏参数
- Burp Scanner:自动化检测缓存投毒漏洞
5. 总结
WEB缓存投毒是一种危害严重的攻击技术,攻击者通过精心构造的请求污染缓存,使其他用户在不知情的情况下接收到恶意内容。防御的关键在于合理配置缓存机制,严格控制缓存键的组成,并对所有用户输入进行严格验证。