大规模缓存投毒总结
字数 1720 2025-08-19 12:40:50
Web缓存投毒攻击技术深度解析
1. 缓存投毒基础概念
Web缓存投毒是一种攻击技术,攻击者通过操纵缓存服务器存储恶意响应,从而影响其他用户的访问体验。当合法用户请求被投毒的URL时,会收到攻击者预先设置的恶意内容而非正常响应。
基本原理
- 缓存服务器根据"缓存键"决定是否使用缓存
- 攻击者找到未被包含在缓存键中的可控输入
- 通过该输入使后端返回恶意响应
- 恶意响应被缓存服务器存储
- 其他用户访问时收到恶意内容
2. 主要攻击技术分类
2.1 主机头大小写攻击
影响目标:Cloudflare、Fastly等CDN
技术细节:
- CDN在生成缓存键时将主机头小写处理
- 但转发请求时保留原始大小写
- 如果后端对大小写敏感,可导致缓存投毒
示例:
GET / HTTP/1.1
Host: EXAMPLE.COM # 大写主机头
修复情况:Cloudflare和Fastly已修复此行为
2.2 URL片段处理不当(CVE-2021-27577)
影响目标:Apache Traffic Server (ATS)
技术细节:
- ATS生成缓存键时忽略URL片段(#后内容)
- 但仍将片段转发给后端
- 导致不同片段URL共享相同缓存键
攻击示例:
GET /path?query#malicious # 被缓存为/path?query
GET /path?query#benign # 返回恶意内容
利用场景:
- 静态文件投毒
- 重定向攻击(XSS/开放重定向)
2.3 非法标头攻击
影响目标:Akamai等
技术细节:
- 发送包含非法字符(如反斜杠)的标头
- 服务器返回400错误但被缓存
- 导致拒绝服务
示例:
GET / HTTP/1.1
Host: example.com
X-Illegal\Header: value # 包含非法字符
2.4 X-Forwarded-Scheme滥用
影响目标:使用Rack中间件的Ruby on Rails应用
技术细节:
- Rack中间件信任X-Forwarded-Scheme标头
- 设置为http导致301重定向
- 重定向被缓存导致循环
影响范围:
- HackerOne(获赏金$2500)
- Shopify(获赏金$6300)
- 多个子域(21个子域XSS)
2.5 方法覆盖攻击
影响目标:GitLab(使用Google Cloud Storage)
技术细节:
- 使用X-HTTP-Method-Override标头
- 设置为HEAD/POST导致405/空响应
- 响应被缓存导致DoS
修复情况:GitLab已修复,获赏金$4850
2.6 403状态码缓存
影响目标:Cloudflare+S3组合
技术细节:
- Cloudflare曾默认缓存403响应
- 发送无效授权标头导致可缓存403
- 影响所有通过Cloudflare代理的S3文件
修复情况:Cloudflare已更改默认配置
3. 高级攻击技术
3.1 Fastly主机头注入
技术细节:
- 特定路径规则仅提取部分URL作为缓存键
- 使用Fastly-Host标头绕过主机白名单
- 可实现跨域文件投毒
利用场景:
- 将易受攻击文件移动到不同域
- 突破同源策略限制
3.2 参数注入攻击
技术细节:
- 缓存键包含特定参数(如size)
- URL编码第二个参数使其被忽略
- 设置恶意值导致可缓存400错误
示例:
GET /image?sizes=100&sizes%3D0 # 后端看到sizes=0
3.3 用户代理过滤漏洞
技术细节:
- 服务器拦截扫描工具User-Agent
- 但拦截响应被缓存
- 导致使用这些UA的普通用户被拦截
4. 自动化检测方法
4.1 标头暴力破解
- 使用工具(如Param Miner)测试未加密标头
- 检测响应变化和缓存行为
4.2 标头来源
- 分析HTTP存档中的Vary标头
- 收集2917个可能影响缓存的标头
4.3 检测模式
- 识别缓存键包含的内容
- 寻找未被包含的可控输入
- 测试后端对这些输入的处理差异
- 验证恶意响应是否被缓存
5. 防御建议
5.1 缓存配置
- 确保所有用户可控输入都包含在缓存键中
- 规范化处理(大小写、编码等)保持一致
- 限制缓存错误响应(400/403等)
5.2 后端处理
- 不信任任何用户提供的输入
- 对主机头、scheme等实施严格验证
- 避免因非法输入导致可缓存错误
5.3 监控措施
- 监控缓存命中率异常
- 记录缓存键生成过程
- 定期审计缓存配置
6. 总结
Web缓存投毒攻击利用缓存服务器与后端处理的不一致性,通过70多种技术变种影响各类CDN和缓存系统。防御关键在于确保缓存键包含所有用户可控输入,并在整个请求处理链中保持一致的规范化处理。