burpsuite 靶场
通过可以参考: https://blog.mlws1900.cn/archives/826
LAB:Exploiting path mapping for web cache deception
利用路径映射欺骗网页缓存
登录后,查看数据包,发现访问 /my-account 响应中包含 API Key

我们将这个请求发送到 repeater,然后在 /my-account 后面添加任意路径,例如修改为 /my-account/123、/my-account/123/index.html,会发现服务器依然正常返回了数据,

在重开一个 repeater 标签(为了方便观察,每发送一次的请求,都是在新标签发送),将请求修改为 /my-account/123.js,发现返回数据正常,同时响应头多了点东西。

这几个响应头字段的大致含义
Cache-Control: max-age=30
含义:这是资源有效期的“倒计时”,规定该资源在缓存服务器(CDN/代理)或浏览器中可以缓存 30 秒。
关键点:
在正常情况下:对于动态页面(如 /my-account),这个值通常应该是 no-store 或 private。
在靶场中:这正是漏洞的根源。它告诉缓存服务器:“你可以随便存这个文件 30 秒,谁来要都给它。”如果这个响应包含你的 API Key,那这 30 秒就是“危险窗口期”。
Age: 0
含义:表示该资源在缓存服务器中已经存放的时间(秒)。
解读:
Age: 0 意味着这个响应是刚刚从后端服务器(Origin)生成的,还没在缓存里待过。
配合 max-age=30,意味着它还剩下 30 秒的“寿命”。如果你在 5 秒后再次请求,你会看到 Age: 5。
X-Cache: miss
含义:缓存未命中。
过程:
你请求了某个 URL。
缓存服务器查了一下自己的“仓库”,发现没有这个文件(或者是文件过期了)。
缓存服务器不得不跑去后方的服务器取货。
后果:由于这次是 miss,缓存服务器在把结果给你的同时,会顺手把它存入仓库(因为 max-age=30 允许它这么做)。下次请求就会变成 hit。
我们立即再次访问这个 /my-account/123.js 请求,发现字段值有了变化。这次的请求是从缓存服务器中取出的。(X-Cache: hit,意味着缓存命中)

分析:在最后面
漏洞利用:我们让用户访问精心构造这个请求,那么他的 key 就会被缓存服务器缓存,然后我们在访问这个请求,缓存服务器就会把这个已经缓存的请求直接响应给我们
<script>document.location="https://YOUR-LAB-ID.web-security-academy.net/my-account/wcd.js"</script>
我们打开 burp 提供的 exploit-server,添加一段 js 代码。然后进行 store,然后将其发送给受害者。

然后在 repeater 中立即访问这个接口,可以看到缓存被命中了,说明这是缓存服务器直接响应给我们的

同时里面的 key 是受害者的 key

分析
正常来讲,/my-account/123.js 这个请求资源并不存在,访问应该是 404 报错,但 Web 缓存欺骗 (Web Cache Deception) 正是利用了服务器在处理“不存在的路径”时表现出的“宽容度”
后端服务的“路径贪婪” (Path Mapping):
- 许多现代 Web 框架(如 Spring, Django, Express)或服务器配置为了支持 RESTful API 或美化 URL,会采用一种前缀匹配或贪婪匹配模式。
- 当请求 /my-account/abc.js 时,后端服务器的逻辑通常是:
- 它首先寻找是否存在名为 abc.js 的物理文件或路由。
- 如果没有找到,它不会立即报 404,而是会检查父级路径 /my-account。
- 如果 /my-account 是一个有效的动态页面,服务器会认为 abc.js 只是传递给该页面的额外路径信息 (Path Info)。
- 结果: 后端依然渲染并返回 /my-account 的内容(即你的个人中心 HTML),且状态码通常是 200 OK 而不是 404。
缓存服务器的“以貌取人”:
- 缓存服务器(如 Cloudflare, Akamai 或 Nginx 代理)通常位于客户端和后端之间。为了提高效率,它们不会解析 HTML 内容,而是根据 URL 的后缀来应用缓存规则。
- 规则设定: 运维人员通常会设置:“所有以 .js, .css, .jpg 结尾的请求,缓存 30 秒。”
- 缓存决策: 当 /my-account/123.js 经过时,缓存服务器看到 .js,直接判定这是一个“静态脚本”。
- 存储行为: 它看到后端返回了 200 OK,于是它不假思索地把后端吐出来的 HTML 内容(本该是动态隐私数据)存入了自己的缓存空间,键名(Cache Key)就是这个 URL。
这就是漏洞的精髓:后端返回了不该是静态资源的内容,而缓存服务器却把它当成了静态资源。
如果在 Burp 靶场中观察,会发现:
第一次访问 /my-account/123.js,响应头显示 X-Cache: miss(缓存未命中),但后端返回了你的 API Key。
第二次(30 秒内)访问,响应头显示 X-Cache: hit(缓存命中)。
这意味着,此时任何互联网上的其他人如果访问这个完全相同且本不存在的 /my-account/123.js,缓存服务器都会直接把你的页面吐给对方。