直接回答:Web 缓存投毒是攻击者构造请求,让 CDN/反向代理缓存住一份"有毒"响应并分发给其他用户;缓存欺骗则相反,诱导缓存保存受害者的私有响应,再被攻击者取走。前者影响全体访客(可投毒 XSS、钓鱼),后者泄露隐私。共同根源都在缓存键设计:哪些请求成分参与键的计算,哪些被忽略。
展开解析:投毒的关键是找到"未键入输入"(unkeyed input)——影响响应却不参与缓存键的成分,如 X-Forwarded-Host、X-Original-URL、重复的 Host 头。若后端用 X-Forwarded-Host 拼接页面资源链接或密码重置链接,而 CDN 的键只含 Host 加路径,攻击者先发请求让缓存存下指向自己域名的页面,后续访客全部中招。缓存欺骗的经典手法是访问 /account/profile.css 这类不存在的静态后缀路径:缓存层按扩展名规则缓存响应,后端却按前缀路由返回了私人页面,攻击者再访问同 URL 取走副本。防御:缓存层只缓存明确的静态资源;后端只信白名单内的转发头;带认证信息的响应一律 Cache-Control: no-store;静态路径不存在时返回 404 而非回源兜底。
追问方向:CDN 缓存键通常包含哪些维度?Vary 头配置不当有何风险?如何借缓存投毒实现持久化 XSS?
(约 420 字)