实战web缓存中毒
字数 1549 2025-08-29 08:32:30
Web缓存投毒全面解析与实战指南
1. 缓存基础概念
1.1 缓存工作原理
Web缓存位于用户和应用程序服务器之间,用于保存和提供某些响应的副本,目的是:
- 加速页面加载(减少延迟)
- 减轻应用服务器负载
常见缓存实现:
- Varnish等软件缓存
- Cloudflare等CDN(内容分发网络)
- Drupal等框架内置缓存
1.2 缓存键(Cache keys)
缓存通过"缓存键"判断两个请求是否请求相同资源,典型缓存键包含:
- 请求路径
- 查询参数
- Host头
- 部分请求头(如User-Agent)
关键问题:如果应用程序响应受未包含在缓存键中的输入(如某些请求头)影响,可能导致缓存投毒。
2. Web缓存投毒原理
2.1 基本概念
Web缓存投毒是指发送导致有害响应的请求,该响应将被缓存并提供给其他用户。
与Web缓存欺骗的区别:
- 缓存投毒:攻击者主动注入恶意内容
- 缓存欺骗:诱导用户暴露敏感信息到缓存
2.2 攻击方法
- 识别未加密的输入(unkeyed inputs)
- 评估可利用性
- 尝试存储到缓存
- 验证缓存行为
3. 实战案例研究
3.1 基础投毒案例(Red Hat)
- 发现未加密输入:X-Forwarded-Host头
- 构造XSS payload:
GET /en?dontpoisoneveryone=1 HTTP/1.1 Host: www.redhat.com X-Forwarded-Host: a."><script>alert(1)</script> - 验证缓存存储(即使有Cache-Control: no-cache)
3.2 选择性投毒
某些缓存将User-Agent包含在缓存键中,导致投毒仅影响特定浏览器版本的用户。
3.3 DOM投毒(data.gov案例)
- 控制data-site-root属性:
<body data-site-root="https://canary/"> - 发现该属性用于加载国际化数据
- 构造恶意翻译文件实现XSS:
{"Show more":"<svg onload=alert(1)>"}
3.4 Mozilla SHIELD劫持
- 通过X-Forwarded-Host头劫持Firefox的recipes获取
- 影响:可能强制数千万用户访问攻击者控制的URL
3.5 路由投毒
利用X-Forwarded-Server等头改变内部路由:
GET / HTTP/1.1
Host: www.goodhire.com
X-Forwarded-Server: canary
响应可能被错误路由到其他服务(如HubSpot)。
3.6 Drupal相关攻击
- 利用X-Original-URL/X-Rewrite-URL覆盖请求路径
- 结合destination参数实现开放重定向
- 嵌套缓存投毒技术
4. 高级攻击技术
4.1 跨云投毒
针对CloudFront/Cloudflare等CDN:
- 识别不同地理位置的缓存节点IP
- 定向攻击特定区域的缓存
4.2 持久投毒技术
- 利用Age和max-age头确定缓存过期时间
- 在缓存过期后立即发送攻击请求
4.3 隐蔽投毒技术
- 使用常见User-Agent列表扩大影响范围
- 针对特定用户代理实现精准攻击
5. 防御措施
5.1 最佳实践
- 禁用缓存(如不可行则限制为纯静态内容)
- 避免从请求头和cookie中获取输入
- 审计所有页面是否存在未加密输入
5.2 缓存层配置
- 从缓存层剥离未加密输入
- 将关键输入添加到缓存键
- 谨慎使用Vary头(某些CDN会忽略)
5.3 框架级修复
- 禁用危险的头处理功能(如Drupal的X-Original-URL)
- 严格验证重定向目标
6. 工具与方法论
6.1 Param Miner工具
Burp Suite扩展,用于:
- 自动发现未加密输入
- 猜测header/cookie名称
- 检测对响应的影响
6.2 测试方法论
- 使用缓存破坏器(cache buster)避免影响真实用户
- 分阶段验证:
- 输入识别
- 可利用性评估
- 缓存存储验证
- 多环境测试(不同地理位置、浏览器等)
7. 总结
Web缓存投毒已成为实际威胁,主要由于:
- 复杂应用堆栈中隐藏的未加密输入
- 缓存默认启用且配置不当
- 框架和CDN的广泛功能被滥用
防御需要开发、运维和安全团队的协作,从应用设计到部署配置的全流程关注。