检测缓存服务器的规范化
您可以使用几种不同的方法来测试缓存如何规范化路径。首先,确定潜在的静态目录。在**"代理">"HTTP 历史记录"**中,查找具有常见静态目录前缀和缓存响应的请求。通过将 HTTP 历史记录过滤器设置为仅显示响应类型为 2xx 且 MIME 类型为 script、images 和 CSS 的消息,来重点关注静态资源。
然后,您可以选择一个带有缓存响应的请求,并使用路径遍历序列和静态路径开头的任意目录重新发送该请求。选择一个响应中包含缓存痕迹的请求。例如/aaa/..%2fassets/js/stockCheck.js:
- 如果响应不再被缓存,则表明缓存未在将路径映射到端点之前对其进行规范化。这说明存在基于
/assets前缀的缓存规则。 - 如果响应仍然被缓存,这可能表明缓存已将路径规范化
/assets/js/stockCheck.js
1. 先理解正常情况
假设网站真正的 JS 文件是:
/assets/js/stockCheck.js
你正常访问:
https://example.com/assets/js/stockCheck.js
服务器返回 JS。
因为 /assets/ 通常被认为是静态资源目录,所以缓存服务器可能有这样的规则:
/assets/* → 可以缓存
于是:
/assets/js/stockCheck.js
第一次访问:
X-Cache: MISS
第二次访问:
X-Cache: HIT
说明它被缓存了。
2. 现在关键来了:构造一个"看起来不一样"的 URL
例如:
/aaa/..%2fassets/js/stockCheck.js
把 %2f 解码:
%2f
↓
/
所以它实际上类似于:
/aaa/../assets/js/stockCheck.js
而:
aaa/..
意味着:
从
aaa目录退回上一级。
所以规范化以后:
/aaa/../assets/js/stockCheck.js
↓
/assets/js/stockCheck.js
也就是说:
/aaa/..%2fassets/js/stockCheck.js
和:
/assets/js/stockCheck.js
最终可能指向同一个资源。
3.流程
你可以这样理解:
第一步
找到真正的静态资源
/assets/js/stockCheck.js
│
↓
X-Cache: HIT
说明:
/assets/ 是一个缓存目录
然后:
第二步
制造一个"表面上不是 /assets/"的 URL
/aaa/..%2fassets/js/stockCheck.js
它经过规范化后:
/aaa/../assets/js/stockCheck.js
↓
/assets/js/stockCheck.js
然后观察:
/aaa/..%2fassets/js/stockCheck.js
│
┌─────────┴─────────┐
↓ ↓
缓存服务器 后端服务器
│ │
↓ ↓
是否规范化路径? 是否规范化路径?
│ │
└─────────┬─────────┘
↓
看 X-Cache
4.最重要的是理解"两个解析器"
这是你这段实验最容易迷糊的地方。
可以把它想象成:
URL
│
↓
┌───────────┐
│ Cache │
└───────────┘
│
↓
判断是否缓存
│
↓
┌───────────┐
│ Web Server│
└───────────┘
│
↓
找真实资源
如果两边理解一致:
Cache:
/aaa/..%2fassets/...
↓
/assets/...
Backend:
/aaa/..%2fassets/...
↓
/assets/...
一般不会产生这种缓存欺骗问题。
但是如果:5.
Cache:
/aaa/..%2fassets/...
↓
不认为是 /assets/
↓
不缓存
Backend:
/aaa/..%2fassets/...
↓
/assets/...
↓
找到真实资源
就出现了解析差异。
5.非常简单的口诀
正常 URL
/assets/js/a.js
缓存认为:
/assets → 静态 → 缓存
测试 URL
/aaa/..%2fassets/js/a.js
实际路径可能是:
/aaa/../assets/js/a.js
↓
/assets/js/a.js
然后问缓存:
你会不会先把它规范化,再判断它是不是
/assets/?
如果不会:
X-Cache: MISS
说明:
缓存判断和后端路径解析可能存在差异。
如果会:
X-Cache: HIT
说明:
缓存可能已经把它规范化为
/assets/js/a.js再进行缓存判断。
实验:利用源服务器规范化进行 Web 缓存欺骗
结合前两个实验和刚才新的规范化方法可以轻松解决本次实验
如果不知道编码转换的 burpsuit也提供了

打上payload开始测试分隔符哪个可以被使用在检测缓存服务器


通过状态可知"?"可以被用来分割url
现在构造就很简单了
因为缓存漏洞 也就是缓存服务器存在于静态资源,所以之后的构造我们需要将/aa/..改成/resources/..
即
/resources/..%2fmy-account
但是我还是打不出hit 只能如此了


之后加入js来缓存 用?进行分隔
<script>window.location="https://0a5c0003047a823b809d03010052002c.web-security-academy.net/resources/..%2fmy-account?a=cd.js"</script>

如果想看最后结果也可以看以下视频来帮助理解