Web缓存投毒(Web Cache Poisoning)漏洞与防护(进阶篇)
字数 996 2025-11-23 08:50:27
Web缓存投毒(Web Cache Poisoning)漏洞与防护(进阶篇)
描述
Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理等),将恶意构造的HTTP响应存储到缓存中,使其他用户访问同一资源时接收到有害内容。与基础缓存投毒不同,进阶篇聚焦于复杂攻击向量,如通过HTTP请求头、URL参数或协议特性(如HTTP/2)污染缓存,最终实现XSS、开放重定向或敏感信息泄露。
解题过程
-
理解缓存键(Cache Keys)机制
- 缓存服务器通过"缓存键"判断请求是否命中缓存。缓存键通常由请求方法、URL路径和特定头(如
Host)组合而成。 - 关键点:未纳入缓存键的请求部分(如某些头或参数)可能被攻击者篡改,但响应仍被缓存。例如,若
X-Forwarded-Host头未纳入键,攻击者可利用它注入恶意内容。
- 缓存服务器通过"缓存键"判断请求是否命中缓存。缓存键通常由请求方法、URL路径和特定头(如
-
识别动态响应生成点
- 扫描应用动态生成内容的位置,如错误页面、重定向URL或脚本资源。例如,
/script.js?callback=alert(1)可能将回调函数写入响应。 - 工具辅助:使用Burp Suite的"Param Miner"扩展自动检测未纳入缓存键的参数或头。
- 扫描应用动态生成内容的位置,如错误页面、重定向URL或脚本资源。例如,
-
构造恶意请求污染缓存
- 通过未纳入缓存键的输入点注入恶意负载。例如:
- 请求:
GET / HTTP/1.1
Host: example.com
X-Forwarded-Host: evil.com - 响应:
<script src="//evil.com/malicious.js"></script>
- 请求:
- 若服务器使用
X-Forwarded-Host生成绝对URL且该头未纳入缓存键,此响应可能被缓存,影响所有访问/的用户。
- 通过未纳入缓存键的输入点注入恶意负载。例如:
-
利用协议特性放大攻击
- HTTP/2的请求走私(HTTP/2 Request Smuggling)可构造歧义请求,使缓存与后端服务器解析不一致,导致缓存投毒。
- 示例:通过HTTP/2流复用发送冲突请求,污染缓存版本。
-
防护机制
- 缓存键配置:确保所有影响响应的要素(如关键头、参数)纳入缓存键。
- 输入验证:严格校验
Host、X-Forwarded-*等头,拒绝非常规值。 - 缓存控制头:使用
Vary头明确指定影响响应的头(如Vary: X-Forwarded-Host)。 - 隔离用户内容:避免缓存包含用户输入的动态资源。