【翻译】Web缓存投毒防御策略绕过
字数 1249 2025-08-27 12:33:37
Web缓存投毒防御策略绕过技术详解
1. Web缓存投毒概述
Web缓存投毒是一种攻击技术,攻击者通过操纵缓存服务器存储恶意响应,从而影响其他用户的访问体验。这种攻击通常利用HTTP请求头中的漏洞,将恶意内容注入到缓存中。
2. 常见防御措施及其缺陷
2.1 Cloudflare的防御策略
Cloudflare部署了两种主要防御策略:
-
WAF规则过滤:阻止包含XSS特征字符(如
<)的请求头- 缺陷:并非所有漏洞都需要特殊字符,部分攻击仍可成功
-
请求头加入缓存键:将
X-Forwarded-Host等请求头加入缓存键计算- 理论效果:使攻击者无法通过这些请求头进行缓存投毒
- 实际缺陷:存在优先级设置和重复请求头问题
2.2 其他厂商的防御尝试
- Akamai:引用Web缓存欺骗的缓解措施,对缓存投毒防护有限
- Fastly:发布详细缓解建议
- Tesla:使用WAF阻止特定字符串导致DoS问题
3. 关键绕过技术详解
3.1 Cloudflare缓存键绕过技术
3.1.1 优先级设置缺陷
当Host头与X-Forwarded-Host头值相同时,Cloudflare不会将后者加入缓存键:
GET / HTTP/1.1
Host: waf.party
X-Forwarded-Host: waf.party
缓存键仅为:https://waf.party/
3.1.2 重复请求头利用
攻击者可提供重复的请求头:
- 第一个实例:无害值
- 第二个实例:包含payload
后端服务器通常会连接两个值(用逗号分隔),而Cloudflare只检查第一个实例:
GET / HTTP/1.1
Host: waf.party
X-Forwarded-Host: waf.party
X-Forwarded-Host: evil.net"/><script...
响应:
<a href="https://waf.party, evil.net"/><script...>
缓存键仍为:https://waf.party/
3.2 其他常见防御绕过技术
-
端口赋值绕过:
- 某些实现只验证host部分而忽略port
GET / HTTP/1.1 Host: redacted.com X-Forwarded-Host: redacted.com:123导致重定向到错误端口
-
WAF误拦截导致DoS:
- Tesla案例:拦截特定字符串后缓存403响应
- 影响所有后续访问者
4. 框架层面的防护措施
- Django/Flask:近年已禁用对危险请求头的支持
- Ruby on Rails:反应较慢,近期才开始部署修复
5. 防御建议
5.1 针对开发者的建议
-
全面验证:不仅检查host,还需验证port等所有相关部分
-
请求头处理:
- 拒绝重复请求头或明确处理规则
- 对所有用户提供的头进行严格过滤
-
缓存策略:
- 避免缓存包含用户输入的响应
- 谨慎设计缓存键生成逻辑
5.2 针对运维人员的建议
-
WAF配置:
- 避免直接拦截并缓存错误响应
- 考虑使用临时拦截而非永久缓存
-
缓存服务器配置:
- 确保所有可能影响响应的因素都包含在缓存键中
- 定期审查缓存策略
6. 工具更新说明
Param Miner工具重要更新:
- 默认禁用静态'fcbz'缓存爆破程序
- 手动测试时需要明确指定缓存爆破值
7. 总结
Web缓存投毒防御需要多层次、全面的策略:
- 框架层面禁用危险功能
- 应用层面严格验证所有输入
- 缓存层面合理设计缓存键
- 运维层面谨慎配置WAF和缓存规则
当前最安全的默认配置属于已修补重复请求头问题的Cloudflare,但开发者仍需注意其他潜在攻击向量。