Web缓存欺骗小试 | 静态目录文件命名缓存方式
字数 2064 2025-08-20 18:17:31

Web缓存欺骗攻击技术详解:静态目录与文件命名缓存方式

1. 分隔符解码差异引发的安全问题

1.1 分隔符解码机制差异

当网站需要在URL中发送包含特殊含义字符(如分隔符)的数据时,通常会对这些字符进行编码。然而不同解析器对编码字符的处理方式存在差异:

  • 源服务器:通常会对编码字符(如%23)进行解码,然后处理
  • 缓存服务器:可能不会解码编码字符,直接应用缓存规则

1.2 常见分隔符及其编码形式

字符 编码 作用
# %23 片段标识符
? %3F 查询字符串起始
/ %2F 路径分隔符
空格 %20 空格符
\0 %00 空字符
\n %0A 换行符
\t %09 制表符

1.3 攻击原理

通过使用编码分隔符将静态扩展添加到缓存(而非源服务器)查看的路径:

  1. 缓存服务器看到的是编码后的URL(如/profile%23wcd.css),根据.css扩展名应用缓存规则
  2. 源服务器解码后看到的是/profile#wcd.css,将#视为分隔符,返回/profile的内容
  3. 攻击者可通过访问/profile%23wcd.css获取被缓存的敏感信息

2. 静态目录缓存规则利用

2.1 标准化差异

缓存和源服务器对URL路径的标准化处理存在差异:

  • 源服务器:可能解码编码字符并解析点段(如..
  • 缓存服务器:可能不解析点段或解码斜杠

2.2 检测标准化方式

检测源服务器标准化方式

  1. 向不可缓存的资源(如POST请求)发送包含路径遍历序列的请求
    • 示例:将/profile修改为/aaa/..%2fprofile
  2. 观察响应:
    • 返回profile信息:源服务器解码斜杠并解析点段
    • 返回404:源服务器不解码斜杠或不解析点段

检测缓存服务器标准化方式

  1. 选择具有缓存响应的请求
  2. 使用路径遍历序列和静态路径开头的任意目录重新发送请求
    • 示例:/aaa/..%2fassets/js/stockCheck.js
  3. 观察响应:
    • 不再缓存:缓存未规范化路径
    • 仍然缓存:缓存已规范化路径

2.3 攻击利用方法

当源服务器解析编码的点段而缓存不解析时,可构造如下有效负载:

/<static-directory-prefix>/..%2f<dynamic-path>

示例:/assets/..%2fprofile

  • 缓存解释为:/assets/..%2fprofile
  • 源服务器解释为:/profile
  • 结果:动态profile信息被缓存

3. 文件命名缓存规则利用

3.1 常见缓存规则

缓存服务器通常会对特定文件扩展名(如.css, .js, .png等)应用缓存规则

3.2 攻击方法

  1. 识别目标网站使用的静态文件扩展名
  2. 在敏感端点后添加静态扩展名
    • 示例:/my-account%3fwcd.css
  3. 缓存服务器看到.css扩展名会缓存响应
  4. 源服务器将%3f解码为?,解释为/my-account?wcd.css
  5. 攻击者访问/my-account%3fwcd.css获取被缓存的账户信息

4. 防御措施

4.1 服务器端防御

  1. 统一标准化处理:确保缓存和源服务器对URL的处理方式一致
  2. 禁用缓存:对敏感内容禁用缓存(使用Cache-Control: no-store
  3. 严格路径验证:拒绝包含..或编码分隔符的请求
  4. 用户相关内容:避免缓存包含用户特定信息的响应

4.2 开发实践

  1. 避免基于扩展名的缓存:不要仅根据文件扩展名决定是否缓存
  2. 规范化处理:在处理请求前统一规范化URL路径
  3. 敏感内容隔离:将静态资源和动态内容放在不同域名下

5. 实战案例

5.1 靶场示例

靶场地址:https://portswigger.net/web-security/web-cache-deception/lab-wcd-exploiting-origin-server-normalization

攻击步骤

  1. 使用提供的凭据(wiener:peter)登录
  2. 识别API Key回显端点(如/my-account
  3. 探测源服务器的截断规则,寻找可用分隔符
  4. 构造有效负载:/static/..%2fmy-account
  5. 诱使受害者访问恶意URL
  6. 从缓存中获取其他用户(如carlos)的API Key

5.2 自动化探测

使用Burp Suite的Intruder模块进行FUZZ测试:

  1. 设置FUZZ位置:/my-accountFUZZ.css
  2. 使用分隔符编码列表作为payload
  3. 分析响应,寻找返回账户信息但被缓存的请求

6. 总结

Web缓存欺骗攻击利用缓存服务器和源服务器对URL处理方式的差异,通过精心构造的URL路径使敏感信息被错误地缓存。防御此类攻击需要开发人员充分理解缓存机制,并在整个请求处理链中实施一致的标准化处理。

Web缓存欺骗攻击技术详解:静态目录与文件命名缓存方式 1. 分隔符解码差异引发的安全问题 1.1 分隔符解码机制差异 当网站需要在URL中发送包含特殊含义字符(如分隔符)的数据时,通常会对这些字符进行编码。然而不同解析器对编码字符的处理方式存在差异: 源服务器 :通常会对编码字符(如%23)进行解码,然后处理 缓存服务器 :可能不会解码编码字符,直接应用缓存规则 1.2 常见分隔符及其编码形式 | 字符 | 编码 | 作用 | |------|------|------| | # | %23 | 片段标识符 | | ? | %3F | 查询字符串起始 | | / | %2F | 路径分隔符 | | 空格 | %20 | 空格符 | | \0 | %00 | 空字符 | | \n | %0A | 换行符 | | \t | %09 | 制表符 | 1.3 攻击原理 通过使用编码分隔符将静态扩展添加到缓存(而非源服务器)查看的路径: 缓存服务器看到的是编码后的URL(如 /profile%23wcd.css ),根据 .css 扩展名应用缓存规则 源服务器解码后看到的是 /profile#wcd.css ,将 # 视为分隔符,返回 /profile 的内容 攻击者可通过访问 /profile%23wcd.css 获取被缓存的敏感信息 2. 静态目录缓存规则利用 2.1 标准化差异 缓存和源服务器对URL路径的标准化处理存在差异: 源服务器 :可能解码编码字符并解析点段(如 .. ) 缓存服务器 :可能不解析点段或解码斜杠 2.2 检测标准化方式 检测源服务器标准化方式 向不可缓存的资源(如POST请求)发送包含路径遍历序列的请求 示例:将 /profile 修改为 /aaa/..%2fprofile 观察响应: 返回profile信息:源服务器解码斜杠并解析点段 返回404:源服务器不解码斜杠或不解析点段 检测缓存服务器标准化方式 选择具有缓存响应的请求 使用路径遍历序列和静态路径开头的任意目录重新发送请求 示例: /aaa/..%2fassets/js/stockCheck.js 观察响应: 不再缓存:缓存未规范化路径 仍然缓存:缓存已规范化路径 2.3 攻击利用方法 当源服务器解析编码的点段而缓存不解析时,可构造如下有效负载: 示例: /assets/..%2fprofile 缓存解释为: /assets/..%2fprofile 源服务器解释为: /profile 结果:动态profile信息被缓存 3. 文件命名缓存规则利用 3.1 常见缓存规则 缓存服务器通常会对特定文件扩展名(如 .css , .js , .png 等)应用缓存规则 3.2 攻击方法 识别目标网站使用的静态文件扩展名 在敏感端点后添加静态扩展名 示例: /my-account%3fwcd.css 缓存服务器看到 .css 扩展名会缓存响应 源服务器将 %3f 解码为 ? ,解释为 /my-account?wcd.css 攻击者访问 /my-account%3fwcd.css 获取被缓存的账户信息 4. 防御措施 4.1 服务器端防御 统一标准化处理 :确保缓存和源服务器对URL的处理方式一致 禁用缓存 :对敏感内容禁用缓存(使用 Cache-Control: no-store ) 严格路径验证 :拒绝包含 .. 或编码分隔符的请求 用户相关内容 :避免缓存包含用户特定信息的响应 4.2 开发实践 避免基于扩展名的缓存 :不要仅根据文件扩展名决定是否缓存 规范化处理 :在处理请求前统一规范化URL路径 敏感内容隔离 :将静态资源和动态内容放在不同域名下 5. 实战案例 5.1 靶场示例 靶场地址:https://portswigger.net/web-security/web-cache-deception/lab-wcd-exploiting-origin-server-normalization 攻击步骤 : 使用提供的凭据(wiener:peter)登录 识别API Key回显端点(如 /my-account ) 探测源服务器的截断规则,寻找可用分隔符 构造有效负载: /static/..%2fmy-account 诱使受害者访问恶意URL 从缓存中获取其他用户(如carlos)的API Key 5.2 自动化探测 使用Burp Suite的Intruder模块进行FUZZ测试: 设置FUZZ位置: /my-accountFUZZ.css 使用分隔符编码列表作为payload 分析响应,寻找返回账户信息但被缓存的请求 6. 总结 Web缓存欺骗攻击利用缓存服务器和源服务器对URL处理方式的差异,通过精心构造的URL路径使敏感信息被错误地缓存。防御此类攻击需要开发人员充分理解缓存机制,并在整个请求处理链中实施一致的标准化处理。