高级漏洞篇之Web缓存投毒专题
字数 2318 2025-08-10 16:34:36

Web缓存投毒攻击全面解析与防御指南

1. Web缓存投毒概述

1.1 基本概念

Web缓存投毒是一种攻击技术,攻击者通过精心构造恶意请求,诱使服务器将恶意响应缓存下来,当其他用户发送相同请求时,会接收到这个被"投毒"的缓存响应。

1.2 攻击流程

  1. 识别并确认不会被缓存的输入:找到既不会被作为缓存键又能影响响应的输入点
  2. 诱发被投毒的响应:构造恶意输入使服务器生成包含攻击载荷的响应
  3. 使响应被缓存:确保恶意响应被服务器缓存

1.3 危害特点

  • 影响范围广:一旦成功,会影响所有访问相同资源的用户
  • 隐蔽性强:受害者只需正常访问网站就可能中招
  • 危害严重:可导致XSS、开放重定向等多种攻击

2. Web缓存机制详解

2.1 缓存键(Cache Key)

缓存键是服务器用来识别"相同请求"的特征集合,通常包括:

  • 请求行(方法、路径)
  • Host头
  • 部分查询参数(视配置而定)

2.2 缓存流程

  1. 服务器收到请求后,先检查缓存中是否有匹配的响应
  2. 如果有且未过期,直接返回缓存响应
  3. 如果没有或已过期,生成新响应并缓存
  4. 缓存通常有有效期(如max-age指定)

2.3 缓存控制头

常见控制缓存的HTTP头:

  • Cache-Control: 指定缓存策略(public/private/no-cache等)
  • Age: 表示响应已被缓存的时间
  • Vary: 指定额外的缓存键字段

3. Web缓存投毒攻击技术

3.1 基于缓存设计缺陷的攻击

3.1.1 利用不被缓存的头字段

攻击示例

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

响应:

HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://a."><script>alert(1)</script>"/cms/social.png" />

利用点

  • X-Forwarded-Host等头字段不被缓存但影响响应
  • 所有访问相同URL的用户都会收到恶意响应

3.1.2 利用不被缓存的Cookie

攻击示例

GET /blog/post.php?mobile=1 HTTP/1.1
Host: innocent-website.com
Cookie: language=pl;

利用点

  • Cookie中的某些字段不被缓存但影响页面内容
  • 可导致所有用户收到特定语言版本的页面

3.1.3 利用多重头组合攻击

攻击示例

GET /random HTTP/1.1
Host: innocent-site.com
X-Forwarded-Proto: http

响应:

HTTP/1.1 301 moved permanently
Location: https://innocent-site.com/random

利用点

  • 组合使用多个头字段实现重定向投毒
  • 可导致用户被重定向到恶意站点

3.2 基于缓存实现缺陷的攻击

3.2.1 缓存键缺陷利用

常见缺陷类型

  1. 排除查询字符串:整个查询字符串不被作为缓存键
  2. 过滤特定参数:如排除utm_等跟踪参数
  3. 规范化输入:如URL解码、大小写统一等

攻击示例

GET /?param=innocent HTTP/1.1
...
param=bad-stuff-here

利用点

  • 请求方法不被作为缓存键
  • 通过正文参数覆盖查询参数值

3.2.2 参数解析差异

攻击示例

GET /?keyed_param=abc&excluded_param=123;keyed_param=bad-stuff-here

利用点

  • 缓存和应用程序对参数分隔符(& vs ;)解析不一致
  • 可导致参数值被覆盖但缓存认为相同

3.2.3 标准化缓存键

攻击示例

GET /example?param=%22%3e%3ctest%3e

利用点

  • 缓存会进行URL解码而应用程序不会
  • 可绕过某些过滤机制

3.2.4 缓存键注入

攻击示例

GET /path?param=123__Origin='-alert(1)-'__ HTTP/1.1

利用点

  • 利用双下划线分隔字段的特性
  • 可注入恶意内容到缓存键中

3.3 内部缓存投毒

特点

  • 应用程序缓存响应片段而非完整响应
  • 攻击者可污染部分缓存片段
  • 影响所有使用该片段的页面

识别方法

  • 观察初始输入和最终输出是否出现在同一响应中

4. 实战攻击案例

4.1 通过Web缓存投毒发动XSS攻击

步骤

  1. 识别可注入的未缓存头字段(如X-Forwarded-Host)
  2. 构造XSS payload注入到响应中
  3. 确保响应被缓存
  4. 受害者访问时执行恶意脚本

4.2 通过Web缓存投毒发动不安全的资源导入

步骤

  1. 识别动态加载的外部资源(如JS文件)
  2. 通过头字段重定向资源加载路径
  3. 在恶意服务器上放置同名恶意文件
  4. 诱导缓存恶意响应

4.3 通过Web缓存投毒发动基于DOM的漏洞

步骤

  1. 识别动态加载的JSON数据
  2. 确保目标允许跨域(CORS)
  3. 注入恶意JSON数据
  4. 诱导应用程序使用恶意数据触发DOM漏洞

5. 检测与利用工具

5.1 Param Miner工具

Burp Suite插件,用于:

  • 自动检测未缓存的头字段和参数
  • 提供"Guess headers"功能
  • 支持缓存粉碎机(cache buster)功能

5.2 手动检测方法

  1. 识别缓存断言

    • 检查Cache-Control、Age等头
    • 观察动态内容变化
    • 测量响应时间差异
  2. 探测缓存键处理

    • 测试端口号是否影响缓存
    • 测试不同参数是否产生相同缓存
    • 检查标准化处理

6. 防御措施

6.1 缓存配置最佳实践

  1. 严格定义缓存键

    • 包含所有可能影响响应的字段
    • 特别注意Host头和请求行
  2. 限制缓存范围

    • 仅缓存静态内容
    • 对敏感内容使用no-cache或private
  3. 禁用不必要的功能

    • 禁用非常规HTTP方法
    • 禁用不必要的HTTP头

6.2 应用程序安全措施

  1. 输入验证与净化

    • 对所有输入进行严格验证
    • 实施输出编码
  2. 资源加载安全

    • 使用固定域名加载资源
    • 实施内容安全策略(CSP)
  3. 监控与日志

    • 监控异常缓存行为
    • 记录详细的缓存操作日志

6.3 针对特定攻击的防御

  1. 防御头字段注入

    • 禁用不必要的头字段
    • 严格验证头字段值
  2. 防御参数污染

    • 统一参数解析逻辑
    • 禁用非常规参数分隔符
  3. 防御缓存键注入

    • 避免使用用户输入构建缓存键
    • 对缓存键进行严格验证

7. 总结

Web缓存投毒是一种危害严重且难以检测的攻击技术,攻击者通过精心构造请求污染服务器缓存,从而影响大量用户。防御这类攻击需要从缓存配置、应用程序安全和监控等多个层面采取措施。关键点包括:

  1. 严格定义缓存键,包含所有可能影响响应的字段
  2. 禁用不必要的功能和头字段
  3. 对所有输入进行严格验证和净化
  4. 实施内容安全策略限制资源加载
  5. 监控缓存行为,及时发现异常

通过全面了解攻击原理和技术,并实施多层次防御措施,可以有效降低Web缓存投毒攻击的风险。

Web缓存投毒攻击全面解析与防御指南 1. Web缓存投毒概述 1.1 基本概念 Web缓存投毒是一种攻击技术,攻击者通过精心构造恶意请求,诱使服务器将恶意响应缓存下来,当其他用户发送相同请求时,会接收到这个被"投毒"的缓存响应。 1.2 攻击流程 识别并确认不会被缓存的输入 :找到既不会被作为缓存键又能影响响应的输入点 诱发被投毒的响应 :构造恶意输入使服务器生成包含攻击载荷的响应 使响应被缓存 :确保恶意响应被服务器缓存 1.3 危害特点 影响范围广:一旦成功,会影响所有访问相同资源的用户 隐蔽性强:受害者只需正常访问网站就可能中招 危害严重:可导致XSS、开放重定向等多种攻击 2. Web缓存机制详解 2.1 缓存键(Cache Key) 缓存键是服务器用来识别"相同请求"的特征集合,通常包括: 请求行(方法、路径) Host头 部分查询参数(视配置而定) 2.2 缓存流程 服务器收到请求后,先检查缓存中是否有匹配的响应 如果有且未过期,直接返回缓存响应 如果没有或已过期,生成新响应并缓存 缓存通常有有效期(如max-age指定) 2.3 缓存控制头 常见控制缓存的HTTP头: Cache-Control : 指定缓存策略(public/private/no-cache等) Age : 表示响应已被缓存的时间 Vary : 指定额外的缓存键字段 3. Web缓存投毒攻击技术 3.1 基于缓存设计缺陷的攻击 3.1.1 利用不被缓存的头字段 攻击示例 : 响应: 利用点 : X-Forwarded-Host 等头字段不被缓存但影响响应 所有访问相同URL的用户都会收到恶意响应 3.1.2 利用不被缓存的Cookie 攻击示例 : 利用点 : Cookie中的某些字段不被缓存但影响页面内容 可导致所有用户收到特定语言版本的页面 3.1.3 利用多重头组合攻击 攻击示例 : 响应: 利用点 : 组合使用多个头字段实现重定向投毒 可导致用户被重定向到恶意站点 3.2 基于缓存实现缺陷的攻击 3.2.1 缓存键缺陷利用 常见缺陷类型 : 排除查询字符串 :整个查询字符串不被作为缓存键 过滤特定参数 :如排除utm_ 等跟踪参数 规范化输入 :如URL解码、大小写统一等 攻击示例 : 利用点 : 请求方法不被作为缓存键 通过正文参数覆盖查询参数值 3.2.2 参数解析差异 攻击示例 : 利用点 : 缓存和应用程序对参数分隔符(& vs ;)解析不一致 可导致参数值被覆盖但缓存认为相同 3.2.3 标准化缓存键 攻击示例 : 利用点 : 缓存会进行URL解码而应用程序不会 可绕过某些过滤机制 3.2.4 缓存键注入 攻击示例 : 利用点 : 利用双下划线分隔字段的特性 可注入恶意内容到缓存键中 3.3 内部缓存投毒 特点 : 应用程序缓存响应片段而非完整响应 攻击者可污染部分缓存片段 影响所有使用该片段的页面 识别方法 : 观察初始输入和最终输出是否出现在同一响应中 4. 实战攻击案例 4.1 通过Web缓存投毒发动XSS攻击 步骤 : 识别可注入的未缓存头字段(如X-Forwarded-Host) 构造XSS payload注入到响应中 确保响应被缓存 受害者访问时执行恶意脚本 4.2 通过Web缓存投毒发动不安全的资源导入 步骤 : 识别动态加载的外部资源(如JS文件) 通过头字段重定向资源加载路径 在恶意服务器上放置同名恶意文件 诱导缓存恶意响应 4.3 通过Web缓存投毒发动基于DOM的漏洞 步骤 : 识别动态加载的JSON数据 确保目标允许跨域(CORS) 注入恶意JSON数据 诱导应用程序使用恶意数据触发DOM漏洞 5. 检测与利用工具 5.1 Param Miner工具 Burp Suite插件,用于: 自动检测未缓存的头字段和参数 提供"Guess headers"功能 支持缓存粉碎机(cache buster)功能 5.2 手动检测方法 识别缓存断言 : 检查Cache-Control、Age等头 观察动态内容变化 测量响应时间差异 探测缓存键处理 : 测试端口号是否影响缓存 测试不同参数是否产生相同缓存 检查标准化处理 6. 防御措施 6.1 缓存配置最佳实践 严格定义缓存键 : 包含所有可能影响响应的字段 特别注意Host头和请求行 限制缓存范围 : 仅缓存静态内容 对敏感内容使用no-cache或private 禁用不必要的功能 : 禁用非常规HTTP方法 禁用不必要的HTTP头 6.2 应用程序安全措施 输入验证与净化 : 对所有输入进行严格验证 实施输出编码 资源加载安全 : 使用固定域名加载资源 实施内容安全策略(CSP) 监控与日志 : 监控异常缓存行为 记录详细的缓存操作日志 6.3 针对特定攻击的防御 防御头字段注入 : 禁用不必要的头字段 严格验证头字段值 防御参数污染 : 统一参数解析逻辑 禁用非常规参数分隔符 防御缓存键注入 : 避免使用用户输入构建缓存键 对缓存键进行严格验证 7. 总结 Web缓存投毒是一种危害严重且难以检测的攻击技术,攻击者通过精心构造请求污染服务器缓存,从而影响大量用户。防御这类攻击需要从缓存配置、应用程序安全和监控等多个层面采取措施。关键点包括: 严格定义缓存键,包含所有可能影响响应的字段 禁用不必要的功能和头字段 对所有输入进行严格验证和净化 实施内容安全策略限制资源加载 监控缓存行为,及时发现异常 通过全面了解攻击原理和技术,并实施多层次防御措施,可以有效降低Web缓存投毒攻击的风险。