Web缓存投毒(Web Cache Poisoning)漏洞与防护
字数 1075 2025-11-22 22:56:48
Web缓存投毒(Web Cache Poisoning)漏洞与防护
描述
Web缓存投毒是一种高级攻击技术,攻击者通过操纵缓存服务器(如CDN、反向代理等),将恶意内容注入缓存中,使其他用户访问同一URL时接收到有害响应。这种攻击的危害在于可大规模传播XSS、资源劫持甚至权限提升漏洞,且难以追踪源头。其核心原理是利用缓存服务器对HTTP请求的解析差异或业务逻辑缺陷,使恶意响应被错误地缓存并分发。
解题过程循序渐进讲解
-
理解Web缓存的工作机制
- 缓存服务器通过缓存键(Cache Key)判断请求是否命中缓存。缓存键通常包含URL、请求方法、部分头部(如
Host)。 - 若请求命中缓存,则直接返回缓存内容;否则,将请求转发给后端服务器,并将响应缓存起来。
- 关键问题:缓存服务器与后端服务器对请求的解析可能不一致(例如,对头部字段的优先级处理不同),导致攻击者可通过精心构造请求污染缓存。
- 缓存服务器通过缓存键(Cache Key)判断请求是否命中缓存。缓存键通常包含URL、请求方法、部分头部(如
-
识别可投毒的缓存键组件
- 攻击者需找到未被纳入缓存键但会影响后端响应的“无键”字段(Unkeyed Headers/Parameters)。例如:
X-Forwarded-Host、X-Origin-URL等代理头部。- 查询参数如
utm_content、version等业务参数。
- 测试方法:在请求中添加可疑字段,观察响应是否变化。若响应变化但缓存未失效,说明该字段可能被用于投毒。
- 攻击者需找到未被纳入缓存键但会影响后端响应的“无键”字段(Unkeyed Headers/Parameters)。例如:
-
构造恶意响应并触发缓存
- 通过无键字段控制后端生成恶意内容(如修改重定向URL、注入JavaScript代码)。
- 确保响应可被缓存:需满足缓存条件(如缓存服务器配置为缓存特定状态码、Content-Type等)。
- 示例攻击链:
- 请求:
GET /index.js?cb=legit HTTP/1.1
Host: example.com
X-Forwarded-Host: attacker.com - 后端返回:
document.domain = 'attacker.com'; // 恶意代码 - 缓存服务器误将此响应与
/index.js?cb=legit的缓存键绑定,后续用户访问同一URL时会执行恶意代码。
- 请求:
-
防护措施
- 缓存键完整性:确保所有影响响应的字段(如Host、查询参数)均纳入缓存键。
- 禁用危险头部:在后端过滤或忽略非常规头部(如
X-Forwarded-Host)。 - 缓存验证:使用
Vary头部明确指定影响响应的字段,但需注意某些CDN可能忽略复杂Vary规则。 - 最小化缓存范围:对动态内容设置较短缓存时间或禁用缓存。