高级漏洞篇之Web缓存投毒专题
字数 2318 2025-08-10 16:34:36
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 利用不被缓存的头字段
攻击示例:
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 缓存键缺陷利用
常见缺陷类型:
- 排除查询字符串:整个查询字符串不被作为缓存键
- 过滤特定参数:如排除utm_等跟踪参数
- 规范化输入:如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攻击
步骤:
- 识别可注入的未缓存头字段(如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缓存投毒攻击的风险。