Web缓存欺骗小试 | 静态扩展缓存方式
字数 2426 2025-08-20 18:17:41

Web缓存欺骗攻击详解与防御指南

1. Web缓存欺骗概述

Web缓存欺骗(Web Cache Deception)是一种安全漏洞,攻击者通过诱导受害者访问特定构造的URL,使缓存服务器错误地将包含敏感信息的动态响应存储为静态资源缓存。之后攻击者可以通过请求相同URL获取这些敏感信息。

核心成因

  • 缓存服务器和源服务器处理请求的方式存在差异
  • 缓存服务器错误地将动态内容识别为静态资源进行缓存

2. Web缓存工作原理

2.1 基本流程

  1. 用户首次请求静态资源 → 缓存中不存在 → 请求转发至源服务器
  2. 源服务器处理请求并响应 → 缓存服务器存储静态资源副本
  3. 用户再次请求相同资源 → 缓存直接响应,不访问源服务器

2.2 缓存关键机制

Cache Keys

缓存服务器通过HTTP请求中的特定元素生成Cache Key来判断是否已有缓存:

  • 常见Cache Key元素:URL路径、查询参数、请求头等
  • Web缓存投毒攻击就是通过控制Cache Keys注入恶意内容

缓存规则

预定义规则决定哪些内容可缓存及缓存时长:

规则类型 示例 描述
静态资源扩展名 .css, .js 匹配请求资源的文件扩展名
静态目录 /static, /assets 匹配以特定前缀开头的URL路径
文件名 robots.txt, favicon.ico 匹配特定文件名
自定义规则 根据业务需求 其他特定缓存规则

3. Web缓存欺骗攻击实施

3.1 攻击流程

  1. 攻击者构造恶意URL并诱导受害者访问(如GET /profile;a.js)
  2. 受害者浏览器向该URL发送请求
  3. 缓存服务器错误识别为静态资源请求,缓存响应
  4. 攻击者请求相同URL获取包含受害者私人信息的缓存响应

3.2 实施步骤

第一步:识别目标端点

  • 寻找返回敏感信息的动态响应端点
  • 重点关注支持GET、HEAD或OPTIONS方法的端点(更改服务器状态的请求通常不被缓存)
  • 检查Burp响应,注意页面上不可见的敏感信息

第二步:发现解析差异

分析缓存服务器与源服务器在以下方面的处理差异:

  1. URL和资源映射方式差异
  2. 分隔符处理差异
  3. URL路径规范化差异

第三步:构造恶意URL

利用发现的差异构造URL,使缓存服务器存储动态响应

3.3 路径映射差异类型

传统路径映射

http://example.com/path/in/files/resource.html

  • /path/in/files/:服务器目录路径
  • resource.html:具体文件名

RESTful风格映射

http://example.com/path/resource/param1/param2

  • /path/resource/:资源endpoint
  • param1/param2:由服务器处理的路径参数

3.4 攻击示例

URL: http://example.com/user/123/profile/wcd.css

  • 源服务器(RESTful风格)

    • /user/123/profile作为endpoint,返回用户123信息
    • 忽略wcd.css参数
  • 缓存服务器(传统映射)

    • 解析为请求名为wcd.css的静态文件
    • 将整个响应(包含用户信息)缓存为静态资源

4. 检测与利用工具

4.1 使用Param Miner插件

  • 自动为每个请求添加唯一query key(动态cachebuster)
  • 避免探测时收到缓存响应而非源服务器响应
  • 配置方法:Burp插件设置中勾选"Add dynamic cachebuster"

4.2 识别缓存响应

通过响应头判断

响应头 含义
X-Cache hit 响应来自缓存
X-Cache miss 响应来自源服务器
X-Cache dynamic 动态生成内容(通常不应缓存)
X-Cache refresh 缓存内容已过期需刷新
Cache-Control 各种指令 指示缓存行为的指令

通过响应时间判断

  • 相同请求响应时间差异大 → 缓存响应通常更快

5. 防御措施

5.1 服务器端防御

  1. 禁用敏感页面的缓存

    • 通过Cache-Control头设置no-storeprivate
    • 示例:Cache-Control: no-store, private
  2. 统一路径解析逻辑

    • 确保缓存服务器与源服务器使用相同的URL解析逻辑
    • 特别是对路径参数和扩展名的处理
  3. 严格缓存规则

    • 仅缓存明确标识为静态资源的响应
    • 对动态内容强制不缓存
  4. 用户敏感操作防护

    • 对涉及敏感信息的操作使用POST而非GET
    • 实施CSRF防护

5.2 缓存服务器配置

  1. 精细化缓存规则

    • 明确指定可缓存的路径和扩展名
    • 避免使用过于宽泛的缓存规则
  2. 区分动态内容

    • 通过响应头识别动态内容并禁止缓存
    • 例如检测X-Cache: dynamic
  3. 敏感内容检测

    • 实现机制检测响应中是否包含敏感信息
    • 对可能包含敏感信息的响应禁止缓存

5.3 开发建议

  1. RESTful API设计

    • 明确区分静态资源和动态端点
    • 对动态端点统一添加防缓存头
  2. 安全测试

    • 定期进行缓存欺骗测试
    • 使用工具自动化检测缓存配置问题
  3. 安全意识培训

    • 使开发人员了解缓存安全风险
    • 在代码审查中检查缓存相关实现

6. 总结

Web缓存欺骗攻击利用缓存系统与源服务器之间的解析差异,通过精心构造的URL诱骗缓存服务器存储敏感信息。防御此类攻击需要从服务器配置、缓存规则和开发实践多方面入手,确保敏感内容不被错误缓存,同时统一各组件对URL的解析逻辑。

Web缓存欺骗攻击详解与防御指南 1. Web缓存欺骗概述 Web缓存欺骗(Web Cache Deception)是一种安全漏洞,攻击者通过诱导受害者访问特定构造的URL,使缓存服务器错误地将包含敏感信息的动态响应存储为静态资源缓存。之后攻击者可以通过请求相同URL获取这些敏感信息。 核心成因 缓存服务器和源服务器处理请求的方式存在差异 缓存服务器错误地将动态内容识别为静态资源进行缓存 2. Web缓存工作原理 2.1 基本流程 用户首次请求静态资源 → 缓存中不存在 → 请求转发至源服务器 源服务器处理请求并响应 → 缓存服务器存储静态资源副本 用户再次请求相同资源 → 缓存直接响应,不访问源服务器 2.2 缓存关键机制 Cache Keys 缓存服务器通过HTTP请求中的特定元素生成Cache Key来判断是否已有缓存: 常见Cache Key元素:URL路径、查询参数、请求头等 Web缓存投毒攻击就是通过控制Cache Keys注入恶意内容 缓存规则 预定义规则决定哪些内容可缓存及缓存时长: | 规则类型 | 示例 | 描述 | |---------|------|------| | 静态资源扩展名 | .css, .js | 匹配请求资源的文件扩展名 | | 静态目录 | /static, /assets | 匹配以特定前缀开头的URL路径 | | 文件名 | robots.txt, favicon.ico | 匹配特定文件名 | | 自定义规则 | 根据业务需求 | 其他特定缓存规则 | 3. Web缓存欺骗攻击实施 3.1 攻击流程 攻击者构造恶意URL并诱导受害者访问(如GET /profile;a.js) 受害者浏览器向该URL发送请求 缓存服务器错误识别为静态资源请求,缓存响应 攻击者请求相同URL获取包含受害者私人信息的缓存响应 3.2 实施步骤 第一步:识别目标端点 寻找返回敏感信息的动态响应端点 重点关注支持GET、HEAD或OPTIONS方法的端点(更改服务器状态的请求通常不被缓存) 检查Burp响应,注意页面上不可见的敏感信息 第二步:发现解析差异 分析缓存服务器与源服务器在以下方面的处理差异: URL和资源映射方式差异 分隔符处理差异 URL路径规范化差异 第三步:构造恶意URL 利用发现的差异构造URL,使缓存服务器存储动态响应 3.3 路径映射差异类型 传统路径映射 http://example.com/path/in/files/resource.html /path/in/files/ :服务器目录路径 resource.html :具体文件名 RESTful风格映射 http://example.com/path/resource/param1/param2 /path/resource/ :资源endpoint param1/param2 :由服务器处理的路径参数 3.4 攻击示例 URL: http://example.com/user/123/profile/wcd.css 源服务器(RESTful风格) : 将 /user/123/profile 作为endpoint,返回用户123信息 忽略 wcd.css 参数 缓存服务器(传统映射) : 解析为请求名为 wcd.css 的静态文件 将整个响应(包含用户信息)缓存为静态资源 4. 检测与利用工具 4.1 使用Param Miner插件 自动为每个请求添加唯一query key(动态cachebuster) 避免探测时收到缓存响应而非源服务器响应 配置方法:Burp插件设置中勾选"Add dynamic cachebuster" 4.2 识别缓存响应 通过响应头判断 | 响应头 | 值 | 含义 | |-------|---|------| | X-Cache | hit | 响应来自缓存 | | X-Cache | miss | 响应来自源服务器 | | X-Cache | dynamic | 动态生成内容(通常不应缓存) | | X-Cache | refresh | 缓存内容已过期需刷新 | | Cache-Control | 各种指令 | 指示缓存行为的指令 | 通过响应时间判断 相同请求响应时间差异大 → 缓存响应通常更快 5. 防御措施 5.1 服务器端防御 禁用敏感页面的缓存 : 通过Cache-Control头设置 no-store 或 private 示例: Cache-Control: no-store, private 统一路径解析逻辑 : 确保缓存服务器与源服务器使用相同的URL解析逻辑 特别是对路径参数和扩展名的处理 严格缓存规则 : 仅缓存明确标识为静态资源的响应 对动态内容强制不缓存 用户敏感操作防护 : 对涉及敏感信息的操作使用POST而非GET 实施CSRF防护 5.2 缓存服务器配置 精细化缓存规则 : 明确指定可缓存的路径和扩展名 避免使用过于宽泛的缓存规则 区分动态内容 : 通过响应头识别动态内容并禁止缓存 例如检测 X-Cache: dynamic 头 敏感内容检测 : 实现机制检测响应中是否包含敏感信息 对可能包含敏感信息的响应禁止缓存 5.3 开发建议 RESTful API设计 : 明确区分静态资源和动态端点 对动态端点统一添加防缓存头 安全测试 : 定期进行缓存欺骗测试 使用工具自动化检测缓存配置问题 安全意识培训 : 使开发人员了解缓存安全风险 在代码审查中检查缓存相关实现 6. 总结 Web缓存欺骗攻击利用缓存系统与源服务器之间的解析差异,通过精心构造的URL诱骗缓存服务器存储敏感信息。防御此类攻击需要从服务器配置、缓存规则和开发实践多方面入手,确保敏感内容不被错误缓存,同时统一各组件对URL的解析逻辑。