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 攻击原理
通过使用编码分隔符将静态扩展添加到缓存(而非源服务器)查看的路径:
- 缓存服务器看到的是编码后的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 攻击利用方法
当源服务器解析编码的点段而缓存不解析时,可构造如下有效负载:
/<static-directory-prefix>/..%2f<dynamic-path>
示例:/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路径使敏感信息被错误地缓存。防御此类攻击需要开发人员充分理解缓存机制,并在整个请求处理链中实施一致的标准化处理。