概念+示例|Web 缓存与缓存投毒

缓存让网站变快,但配置不当会变成”投毒”通道——把恶意响应存起来发给所有用户。

① 是什么

Web 缓存 由 CDN/反向代理/浏览器保存响应,命中缓存直接返回。缓存投毒(Cache Poisoning) 指攻击者让缓存存一份”含恶意内容”的响应,并把它投递给后续受害者。

② 为什么重要

  • 一次投毒可影响大量用户,危害面远大于单点 XSS。
  • 常源于”缓存键”与”影响响应的未键入头”之间的错位。

③ 核心概念拆解(带示例)

  • 缓存键(Cache Key):决定”哪些请求算同一个”的字段(通常 URL + 少量头)。
  • 未键入输入(Unkeyed Input):像 X-Forwarded-HostUser-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


This site uses Just the Docs, a documentation theme for Jekyll.