【由浅入深_打牢基础】WEB缓存投毒(上)
字数 1763 2025-08-27 12:33:37
WEB缓存投毒技术详解
一、WEB缓存投毒基础概念
1.1 什么是WEB缓存投毒
WEB缓存投毒是一种攻击技术,攻击者利用缓存机制将有害的HTTP响应提供给其他用户。当恶意响应被缓存后,所有访问相同资源的用户都会收到这个被污染的响应。
1.2 缓存工作原理
缓存机制的工作流程:
- 用户发起请求时,请求首先经过缓存服务器
- 如果缓存中存在匹配的响应,直接返回给用户
- 如果缓存中不存在,请求会被转发到后端服务器
- 后端服务器响应后,响应会被添加到缓存中
- 后续用户的等效请求将从缓存中获取响应
1.3 缓存键(Cache Key)与非缓存键
- 缓存键:预先定义的请求头中的一些键作为缓存键,只要这些键的值相同,后端就认为两个请求是等效的
- 非缓存键:请求头中除缓存键外的其他键,这些键的值不会影响缓存匹配
缓存投毒的关键在于利用非缓存键,因为:
- 缓存键通常不能改变,否则无法与其他用户等效
- 页面内容需要根据非缓存键的值动态生成
二、漏洞利用技术
2.1 基本利用条件
成功的WEB缓存投毒需要满足两个条件:
- 存在可被利用的非缓存键
- 页面内容会根据非缓存键的值动态生成
2.2 利用未键标头的投毒
案例:利用X-Forwarded-Host头
- 使用Param Miner插件探测影响响应的非缓存键
- 发现X-Forwarded-Host影响页面内容
- 构造恶意请求:
GET / HTTP/1.1 Host: test.com X-Forwarded-Host: #'></a><script>alert(1)</script> - 响应变为:
<a href='#'></a><script>alert(1)</script></a>
关键点:
- 测试时添加随机参数防止请求被缓存
- 观察X-Cache头判断是否命中缓存
2.3 利用未键入Cookie的投毒
案例:利用fehost cookie
- 发现fehost cookie值会影响响应内容
- 构造payload:
fehost=someString"%2Balert(1)%2B"someString - 投毒根页面而非特定产品页面
2.4 利用多个标头的投毒
案例:组合X-Forwarded-Host和X-Forwarded-Scheme
- 使用Param Miner探测发现X-Forwarded-Scheme
- 结合X-Forwarded-Host一起使用
- 利用重定向漏洞:
- 使页面重定向到攻击者控制的JS文件
- 投毒/resources/js/tracking.js请求
2.5 有针对性的投毒
案例:利用X-Host头
- 发现X-Host是非缓存键
- 响应包Vary头包含User-Agent,说明UA是缓存键
- 通过留言板获取目标用户UA:
- 根据目标UA构造投毒请求
2.6 利用无键查询字符串
案例:参数不作为缓存键
- 发现改变参数不影响缓存匹配
- 构造XSS payload直接投毒主页
- 所有用户访问主页时都会触发恶意脚本
2.7 利用未键入查询参数
案例:utm_content参数
- 使用Param Miner探测发现utm_content是非缓存键
- UTM相关参数通常不作为缓存键
- 构造请求:
GET /?callback=setCountryCookie&utm_content=;callback=alert(1) - 响应包含恶意脚本但不会影响缓存匹配
2.8 参数隐藏技术
高级技巧:
- 使用分号分隔多个参数
- 将恶意payload隐藏在非缓存参数的值中
- 确保主要缓存键保持不变
三、工具与技术
3.1 Param Miner插件
Burp Suite插件,用于:
- 自动探测影响响应的header和参数
- 识别非缓存键
- 发现隐藏的参数依赖关系
使用方法:
- 右键请求包
- 选择"Guess headers"或"Guess parameters"
- 使用默认设置执行探测
3.2 缓存检测技巧
判断缓存命中的方法:
- 观察X-Cache头:miss表示未命中,hit表示命中
- 快速发送相同请求,比较响应时间
- 添加随机参数防止请求被缓存
3.3 防止请求被缓存
添加以下header可防止请求被缓存:
Cache-Control: no-store
Pragma: no-cache
四、防御措施
4.1 对开发者的建议
- 谨慎选择缓存键,确保安全相关参数包含在内
- 对动态内容谨慎使用缓存
- 避免根据用户输入直接生成页面内容
- 实施严格的输入过滤和输出编码
4.2 对管理员建议
- 配置缓存服务器忽略高风险header
- 限制可缓存的页面范围
- 实施缓存净化机制
- 监控异常的缓存命中模式
五、总结
WEB缓存投毒是一种危害严重的攻击技术,攻击者通过精心构造的请求污染缓存,影响大量用户。防御的关键在于正确配置缓存机制,严格区分缓存键和非缓存键,并对用户输入进行严格过滤。安全测试人员应掌握Param Miner等工具的使用,全面测试缓存相关漏洞。