大规模缓存投毒总结
字数 1720 2025-08-19 12:40:50

Web缓存投毒攻击技术深度解析

1. 缓存投毒基础概念

Web缓存投毒是一种攻击技术,攻击者通过操纵缓存服务器存储恶意响应,从而影响其他用户的访问体验。当合法用户请求被投毒的URL时,会收到攻击者预先设置的恶意内容而非正常响应。

基本原理

  • 缓存服务器根据"缓存键"决定是否使用缓存
  • 攻击者找到未被包含在缓存键中的可控输入
  • 通过该输入使后端返回恶意响应
  • 恶意响应被缓存服务器存储
  • 其他用户访问时收到恶意内容

2. 主要攻击技术分类

2.1 主机头大小写攻击

影响目标:Cloudflare、Fastly等CDN

技术细节

  • CDN在生成缓存键时将主机头小写处理
  • 但转发请求时保留原始大小写
  • 如果后端对大小写敏感,可导致缓存投毒

示例

GET / HTTP/1.1
Host: EXAMPLE.COM  # 大写主机头

修复情况:Cloudflare和Fastly已修复此行为

2.2 URL片段处理不当(CVE-2021-27577)

影响目标:Apache Traffic Server (ATS)

技术细节

  • ATS生成缓存键时忽略URL片段(#后内容)
  • 但仍将片段转发给后端
  • 导致不同片段URL共享相同缓存键

攻击示例

GET /path?query#malicious  # 被缓存为/path?query
GET /path?query#benign     # 返回恶意内容

利用场景

  • 静态文件投毒
  • 重定向攻击(XSS/开放重定向)

2.3 非法标头攻击

影响目标:Akamai等

技术细节

  • 发送包含非法字符(如反斜杠)的标头
  • 服务器返回400错误但被缓存
  • 导致拒绝服务

示例

GET / HTTP/1.1
Host: example.com
X-Illegal\Header: value  # 包含非法字符

2.4 X-Forwarded-Scheme滥用

影响目标:使用Rack中间件的Ruby on Rails应用

技术细节

  • Rack中间件信任X-Forwarded-Scheme标头
  • 设置为http导致301重定向
  • 重定向被缓存导致循环

影响范围

  • HackerOne(获赏金$2500)
  • Shopify(获赏金$6300)
  • 多个子域(21个子域XSS)

2.5 方法覆盖攻击

影响目标:GitLab(使用Google Cloud Storage)

技术细节

  • 使用X-HTTP-Method-Override标头
  • 设置为HEAD/POST导致405/空响应
  • 响应被缓存导致DoS

修复情况:GitLab已修复,获赏金$4850

2.6 403状态码缓存

影响目标:Cloudflare+S3组合

技术细节

  • Cloudflare曾默认缓存403响应
  • 发送无效授权标头导致可缓存403
  • 影响所有通过Cloudflare代理的S3文件

修复情况:Cloudflare已更改默认配置

3. 高级攻击技术

3.1 Fastly主机头注入

技术细节

  • 特定路径规则仅提取部分URL作为缓存键
  • 使用Fastly-Host标头绕过主机白名单
  • 可实现跨域文件投毒

利用场景

  • 将易受攻击文件移动到不同域
  • 突破同源策略限制

3.2 参数注入攻击

技术细节

  • 缓存键包含特定参数(如size)
  • URL编码第二个参数使其被忽略
  • 设置恶意值导致可缓存400错误

示例

GET /image?sizes=100&sizes%3D0  # 后端看到sizes=0

3.3 用户代理过滤漏洞

技术细节

  • 服务器拦截扫描工具User-Agent
  • 但拦截响应被缓存
  • 导致使用这些UA的普通用户被拦截

4. 自动化检测方法

4.1 标头暴力破解

  • 使用工具(如Param Miner)测试未加密标头
  • 检测响应变化和缓存行为

4.2 标头来源

  • 分析HTTP存档中的Vary标头
  • 收集2917个可能影响缓存的标头

4.3 检测模式

  1. 识别缓存键包含的内容
  2. 寻找未被包含的可控输入
  3. 测试后端对这些输入的处理差异
  4. 验证恶意响应是否被缓存

5. 防御建议

5.1 缓存配置

  • 确保所有用户可控输入都包含在缓存键中
  • 规范化处理(大小写、编码等)保持一致
  • 限制缓存错误响应(400/403等)

5.2 后端处理

  • 不信任任何用户提供的输入
  • 对主机头、scheme等实施严格验证
  • 避免因非法输入导致可缓存错误

5.3 监控措施

  • 监控缓存命中率异常
  • 记录缓存键生成过程
  • 定期审计缓存配置

6. 总结

Web缓存投毒攻击利用缓存服务器与后端处理的不一致性,通过70多种技术变种影响各类CDN和缓存系统。防御关键在于确保缓存键包含所有用户可控输入,并在整个请求处理链中保持一致的规范化处理。

Web缓存投毒攻击技术深度解析 1. 缓存投毒基础概念 Web缓存投毒是一种攻击技术,攻击者通过操纵缓存服务器存储恶意响应,从而影响其他用户的访问体验。当合法用户请求被投毒的URL时,会收到攻击者预先设置的恶意内容而非正常响应。 基本原理 缓存服务器根据"缓存键"决定是否使用缓存 攻击者找到未被包含在缓存键中的可控输入 通过该输入使后端返回恶意响应 恶意响应被缓存服务器存储 其他用户访问时收到恶意内容 2. 主要攻击技术分类 2.1 主机头大小写攻击 影响目标 :Cloudflare、Fastly等CDN 技术细节 : CDN在生成缓存键时将主机头小写处理 但转发请求时保留原始大小写 如果后端对大小写敏感,可导致缓存投毒 示例 : 修复情况 :Cloudflare和Fastly已修复此行为 2.2 URL片段处理不当(CVE-2021-27577) 影响目标 :Apache Traffic Server (ATS) 技术细节 : ATS生成缓存键时忽略URL片段(#后内容) 但仍将片段转发给后端 导致不同片段URL共享相同缓存键 攻击示例 : 利用场景 : 静态文件投毒 重定向攻击(XSS/开放重定向) 2.3 非法标头攻击 影响目标 :Akamai等 技术细节 : 发送包含非法字符(如反斜杠)的标头 服务器返回400错误但被缓存 导致拒绝服务 示例 : 2.4 X-Forwarded-Scheme滥用 影响目标 :使用Rack中间件的Ruby on Rails应用 技术细节 : Rack中间件信任X-Forwarded-Scheme标头 设置为http导致301重定向 重定向被缓存导致循环 影响范围 : HackerOne(获赏金$2500) Shopify(获赏金$6300) 多个子域(21个子域XSS) 2.5 方法覆盖攻击 影响目标 :GitLab(使用Google Cloud Storage) 技术细节 : 使用X-HTTP-Method-Override标头 设置为HEAD/POST导致405/空响应 响应被缓存导致DoS 修复情况 :GitLab已修复,获赏金$4850 2.6 403状态码缓存 影响目标 :Cloudflare+S3组合 技术细节 : Cloudflare曾默认缓存403响应 发送无效授权标头导致可缓存403 影响所有通过Cloudflare代理的S3文件 修复情况 :Cloudflare已更改默认配置 3. 高级攻击技术 3.1 Fastly主机头注入 技术细节 : 特定路径规则仅提取部分URL作为缓存键 使用Fastly-Host标头绕过主机白名单 可实现跨域文件投毒 利用场景 : 将易受攻击文件移动到不同域 突破同源策略限制 3.2 参数注入攻击 技术细节 : 缓存键包含特定参数(如size) URL编码第二个参数使其被忽略 设置恶意值导致可缓存400错误 示例 : 3.3 用户代理过滤漏洞 技术细节 : 服务器拦截扫描工具User-Agent 但拦截响应被缓存 导致使用这些UA的普通用户被拦截 4. 自动化检测方法 4.1 标头暴力破解 使用工具(如Param Miner)测试未加密标头 检测响应变化和缓存行为 4.2 标头来源 分析HTTP存档中的Vary标头 收集2917个可能影响缓存的标头 4.3 检测模式 识别缓存键包含的内容 寻找未被包含的可控输入 测试后端对这些输入的处理差异 验证恶意响应是否被缓存 5. 防御建议 5.1 缓存配置 确保所有用户可控输入都包含在缓存键中 规范化处理(大小写、编码等)保持一致 限制缓存错误响应(400/403等) 5.2 后端处理 不信任任何用户提供的输入 对主机头、scheme等实施严格验证 避免因非法输入导致可缓存错误 5.3 监控措施 监控缓存命中率异常 记录缓存键生成过程 定期审计缓存配置 6. 总结 Web缓存投毒攻击利用缓存服务器与后端处理的不一致性,通过70多种技术变种影响各类CDN和缓存系统。防御关键在于确保缓存键包含所有用户可控输入,并在整个请求处理链中保持一致的规范化处理。