实战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 攻击方法

  1. 识别未加密的输入(unkeyed inputs)
  2. 评估可利用性
  3. 尝试存储到缓存
  4. 验证缓存行为

3. 实战案例研究

3.1 基础投毒案例(Red Hat)

  1. 发现未加密输入:X-Forwarded-Host头
  2. 构造XSS payload:
    GET /en?dontpoisoneveryone=1 HTTP/1.1
    Host: www.redhat.com
    X-Forwarded-Host: a."><script>alert(1)</script>
    
  3. 验证缓存存储(即使有Cache-Control: no-cache)

3.2 选择性投毒

某些缓存将User-Agent包含在缓存键中,导致投毒仅影响特定浏览器版本的用户。

3.3 DOM投毒(data.gov案例)

  1. 控制data-site-root属性:
    <body data-site-root="https://canary/">
    
  2. 发现该属性用于加载国际化数据
  3. 构造恶意翻译文件实现XSS:
    {"Show more":"<svg onload=alert(1)>"}
    

3.4 Mozilla SHIELD劫持

  1. 通过X-Forwarded-Host头劫持Firefox的recipes获取
  2. 影响:可能强制数千万用户访问攻击者控制的URL

3.5 路由投毒

利用X-Forwarded-Server等头改变内部路由:

GET / HTTP/1.1
Host: www.goodhire.com
X-Forwarded-Server: canary

响应可能被错误路由到其他服务(如HubSpot)。

3.6 Drupal相关攻击

  1. 利用X-Original-URL/X-Rewrite-URL覆盖请求路径
  2. 结合destination参数实现开放重定向
  3. 嵌套缓存投毒技术

4. 高级攻击技术

4.1 跨云投毒

针对CloudFront/Cloudflare等CDN:

  1. 识别不同地理位置的缓存节点IP
  2. 定向攻击特定区域的缓存

4.2 持久投毒技术

  1. 利用Age和max-age头确定缓存过期时间
  2. 在缓存过期后立即发送攻击请求

4.3 隐蔽投毒技术

  1. 使用常见User-Agent列表扩大影响范围
  2. 针对特定用户代理实现精准攻击

5. 防御措施

5.1 最佳实践

  1. 禁用缓存(如不可行则限制为纯静态内容)
  2. 避免从请求头和cookie中获取输入
  3. 审计所有页面是否存在未加密输入

5.2 缓存层配置

  1. 从缓存层剥离未加密输入
  2. 将关键输入添加到缓存键
  3. 谨慎使用Vary头(某些CDN会忽略)

5.3 框架级修复

  1. 禁用危险的头处理功能(如Drupal的X-Original-URL)
  2. 严格验证重定向目标

6. 工具与方法论

6.1 Param Miner工具

Burp Suite扩展,用于:

  • 自动发现未加密输入
  • 猜测header/cookie名称
  • 检测对响应的影响

6.2 测试方法论

  1. 使用缓存破坏器(cache buster)避免影响真实用户
  2. 分阶段验证:
    • 输入识别
    • 可利用性评估
    • 缓存存储验证
  3. 多环境测试(不同地理位置、浏览器等)

7. 总结

Web缓存投毒已成为实际威胁,主要由于:

  1. 复杂应用堆栈中隐藏的未加密输入
  2. 缓存默认启用且配置不当
  3. 框架和CDN的广泛功能被滥用

防御需要开发、运维和安全团队的协作,从应用设计到部署配置的全流程关注。

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: 验证缓存存储(即使有Cache-Control: no-cache) 3.2 选择性投毒 某些缓存将User-Agent包含在缓存键中,导致投毒仅影响特定浏览器版本的用户。 3.3 DOM投毒(data.gov案例) 控制data-site-root属性: 发现该属性用于加载国际化数据 构造恶意翻译文件实现XSS: 3.4 Mozilla SHIELD劫持 通过X-Forwarded-Host头劫持Firefox的recipes获取 影响:可能强制数千万用户访问攻击者控制的URL 3.5 路由投毒 利用X-Forwarded-Server等头改变内部路由: 响应可能被错误路由到其他服务(如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的广泛功能被滥用 防御需要开发、运维和安全团队的协作,从应用设计到部署配置的全流程关注。