概念+示例|Web 缓存与缓存投毒
缓存让网站变快,但配置不当会变成”投毒”通道——把恶意响应存起来发给所有用户。
① 是什么
Web 缓存 由 CDN/反向代理/浏览器保存响应,命中缓存直接返回。缓存投毒(Cache Poisoning) 指攻击者让缓存存一份”含恶意内容”的响应,并把它投递给后续受害者。
② 为什么重要
- 一次投毒可影响大量用户,危害面远大于单点 XSS。
- 常源于”缓存键”与”影响响应的未键入头”之间的错位。
③ 核心概念拆解(带示例)
- 缓存键(Cache Key):决定”哪些请求算同一个”的字段(通常 URL + 少量头)。
- 未键入输入(Unkeyed Input):像
X-Forwarded-Host、User-Agent出现在响应里、却不在缓存键中——攻击者可借此改变响应内容而被缓存。 - 投毒请求示例:
GET /en HTTP/1.1
Host: vulnerable.com
X-Forwarded-Host: evil.com ← 未键入,但被拼进响应里的 <base href>
HTTP/1.1 200 OK
Cache-Control: public, max-age=3600 ← 被缓存
<html><base href="https://evil.com">… ← 后续受害者命中缓存拿到此页
- 设计缺陷型利用(PortSwigger 重点):不安全重定向、动态内容拼接等都可被缓存放大。
④ 常见误区
- 缓存只存静态资源?带查询参数的 API/页面响应也可能被缓存。
- 有缓存就快且安全?未键入输入是经典投毒温床。
- WAF 能挡?投毒是逻辑/配置问题,WAF 常常看不到。
⑤ 一句话小结
缓存投毒利用”缓存键 ≠ 影响响应的输入”的错位,把恶意响应缓存并广发给用户;收敛未键入输入、谨慎缓存动态响应是关键。
参考来源:https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws