实验:利用路径映射欺骗网页缓存
要完成这个实验,你需要知道:
- 正则表达式端点如何将 URL 路径映射到资源。
- 如何检测和利用缓存服务器和源服务器映射 URL 路径方式的差异。
使用以下凭据登录您自己的帐户wiener:peter
登录后便可以repeter账户页面
根据以下url请求开始测试
/my-account
↓
/my-account/abc
↓
/my-account/abc.js
先发送正常请求

再发送对/my-account/abc的请求

之后可以发送对/my-account/abc.js的请求

可以发现出现两个非常关键的响应头Cache-Control和X-Cache
解释下
X-Cache: miss
miss 表示:
这次响应没有从缓存中拿,而是去后端服务器重新获取的。
可以理解成:
浏览器
│
│ GET /my-account/abc.js
▼
CDN / 缓存服务器
│
│ 没找到缓存 → MISS
▼
后端服务器
│
│ 返回响应
▼
CDN缓存服务器
│
│ 把响应缓存起来
▼
浏览器
所以第一次访问的目的并不是攻击,而是建立基准。
Cache-Control: max-age=30
这个响应头表示:
如果缓存服务器缓存了这个响应,那么它可以在 30 秒内直接使用这个缓存响应。
所以:
第一次请求
↓
MISS
↓
后端生成响应
↓
缓存服务器保存响应
↓
有效期 30 秒
这就给了我们一个实验条件:
30 秒内再次请求同一个缓存键,有可能不再访问后端,而直接拿缓存。
30 秒内再次发送
再次发送:
GET /my-account/abc.js HTTP/1.1
Host: example.com
结果:
X-Cache: hit
这非常关键。
hit 意味着:
这次响应直接来自缓存。
流程变成:
浏览器
│
│ GET /my-account/abc.js
▼
缓存服务器
│
│ 找到之前缓存的结果
│
│ HIT
▼
直接返回缓存内容
后端甚至可能没有参与这次请求。
理解:为什么 /my-account/abc.js 会被缓存?
这里才是这个实验的核心。
正常情况下:
/my-account/
明显是一个动态、私密页面。
例如:
GET /my-account/
可能返回:
<h1>Welcome, Alice</h1>
<p>Email: alice@example.com</p>
这种内容通常不应该被公共缓存。
但是你构造了:
/my-account/abc.js
虽然实际上:
/my-account/abc.js
并不一定真的存在。
问题在于:缓存服务器可能只看 URL 后缀
它可能看到:
/my-account/abc.js
↑
.js
然后认为:
.js是静态资源,应该可以缓存。
于是缓存服务器按照类似这样的规则:
如果 URL 以 .js 结尾
↓
认为是静态资源
↓
允许缓存
但是后端服务器怎么看?
后端服务器可能没有把:
/my-account/abc.js
当成一个真正的 JavaScript 文件。
它可能通过路由机制把它解释成:
/my-account/
或者:
/my-account/xxx
也就是说:
缓存服务器和后端服务器对同一个 URL 的理解不一样
这是整个漏洞的关键。
可以画成:
/my-account/abc.js
│
┌──────────┴──────────┐
│ │
▼ ▼
缓存服务器 后端服务器
│ │
看 URL 后缀 看应用路由
│ │
.js文件 /my-account
│ │
▼ ▼
可以缓存 私人账户页面
于是出现了一个危险情况:
缓存服务器:
/my-account/abc.js
↓
静态 JS 文件
↓
可以缓存
后端服务器:
/my-account/abc.js
↓
/my-account
↓
用户私人数据
++推理链++
① /my-account/abc.js
↓
② 第一次请求
↓
③ X-Cache: miss
↓
④ Cache-Control: max-age=30
↓
⑤ 说明响应可以被缓存
↓
⑥ 30秒内再次请求
↓
⑦ X-Cache: hit
↓
⑧ 证明该 URL 已经进入缓存
↓
⑨ 为什么?
↓
⑩ 缓存可能根据 .js 判断它是静态资源
↓
⑪ 但后端可能把它当成 /my-account 动态页面
↓
⑫ 缓存层和后端对 URL 的解释产生差异
↓
⑬ 可能形成 Web Cache Deception
完成实验

点击go to exploit server 在body中插入我们想要对用户的网络欺骗代码(欺取缓存session后登入账户拿到专属api)
<script>window.location="https://0aea003004e6a85b80a50863004900f5.web-security-academy.net/my-account/xzy.js"</script>
点击Deliver exploit to victim算是发送给用户
然后访问以下url
https://0aea003004e6a85b80a50863004900f5.web-security-academy.net/my-account/xzy.js

获得用户的api key 将其复制提交至submit solution 即可
攻克工程极短 但是想要完全理解如何一步一步检测出缓存欺骗的可行性需要花些时间与理解
我的攻克过程没能完成hit 可以参考以下视频借鉴学习