目录
- [1. 实验背景](#1. 实验背景)
- [2. 构造请求](#2. 构造请求)
- [3. 构建漏洞](#3. 构建漏洞)
- [4. 细节提示](#4. 细节提示)
- [5. 实战辨别解码方式](#5. 实战辨别解码方式)
- [6. 说明](#6. 说明)
摘要: 本文基于 PortSwigger Web Security Academy 官方授权实验靶场,演示 Web 缓存欺骗漏洞的完整复现过程。实验将"主动解码"的角色从源服务器切换到缓存服务器,通过构造 /my-account%23%2f%2e%2e%2fresources?wcd 这类编码路径,利用 # 作为源服务器分隔符、?wcd 作为缓存破坏器,使缓存服务器把 /my-account 的响应当作 /resources 静态资源缓存下来。文章还系统梳理了 URL 编码对照表、攻击链拆解,以及实战中辨别"源服务器解码"与"缓存服务器解码"的三步探测方法,帮助读者理解漏洞成因并掌握防御思路。

- 这个实验和我们上一个实验其实还是比较相似的,就是它把"主动解码"的角色从源服务器换成了缓存服务器。
前面的重复的登录以及拦截以及判断分隔符操作跳过,直接进行到构造请求查看相应的操作上,前提:我们得到 # 和 ? 是作为有效的分割符,但是我们还要去自己测试一下反应,看到底是不是都有效。

- 然后我们就去构造这个请求,在同样的操作之下,只有
#返回的结果存在X-Cache缓存相应头,说明这个才是有效的,然后攻击路径是:
攻击路径:/my-account%23%2f%2e%2e%2fresources
| 字符 | URL编码 | 说明 |
|---|---|---|
/ |
%2f |
路径分隔符 |
. |
%2e |
点(用于路径遍历) |
? |
%3f |
查询参数起始符 |
# |
%23 |
锚点标识符 |
; |
%3b |
分隔符(在某些系统中) |
| 空格 | %20 |
空格 |
% |
%25 |
百分号本身 |

- 然后回到实验页面去构建漏洞:
html
<script>
document.location="https://你的实验ID.web-security-academy.net/my-account%23%2f%2e%2e%2fresources?wcd";
</script>
然后去访问这个地址就可以得到最后目的 API。

4.细节提示
?wcd 是"缓存破坏器",它的作用不是"让攻击生效",而是"让攻击稳定生效"。
攻击路径:/my-account%23%2f%2e%2e%2fresources?wcd
│ │ │
│ │ └─ 缓存破坏器(?wcd)
│ │ 作用:让受害者访问"新"路径,避免缓存污染
│ └─ 编码后的路径遍历部分
│ 作用:让缓存服务器"绕道"到/resources目录
└─ #的编码(%23)
作用:告诉源服务器"忽略#后面的所有内容"
-
%23是给源服务器看的"分隔符"。 -
?wcd是给缓存服务器看的"刷新标记"。
攻击链拆解
攻击路径:/my-account%23%2f%2e%2e%2fresources?wcd
源服务器看到的是:/my-account(因为 # 是分隔符)
缓存服务器看到的是:/resources(因为缓存会解码 %2f%2e%2e%2f 为 /../)
结果:缓存服务器把 /my-account 的响应,当成 /resources 的静态资源存下来了。
5.在实战中如何辨别是缓存服务器解码还是源服务器解码
第一步:建立基准(确认分隔符)
-
登录应用,获取一个包含你个人信息的页面(比如
/my-account),把它作为基准响应。 -
用Intruder测试常见的分隔符(如
;、#、?),找出源服务器把哪个字符当作分隔符(即该字符后跟任意内容仍能返回200)。 -
这一步是必要的,因为后续的探测路径需要用到这个分隔符来"隔离"源服务器的视线。
第二步:测试"源服务器规范化"(即源服务器解码模式)
-
构造一个路径,让源服务器有机会解码并解析路径遍历符,例如
/aaa/..%2fmy-account。 -
观察结果:
-
如果返回200(你的个人主页) → 结论:源服务器会主动解码并规范化路径。
-
如果返回404 → 说明源服务器不解码
..%2f,继续下一步。
-
第三步:测试"缓存服务器规范化"(即缓存服务器解码模式)
-
现在,利用第一步找到的分隔符(假设是
#),构造一个路径,将路径遍历编码放到分隔符的"保护"之后,例如/my-account#%2f%2e%2e%2fresources。 -
观察响应头,特别是
X-Cache或类似字段:-
发送第一次:看到
X-Cache: miss。 -
立即发送第二次:
-
如果
X-Cache变成hit→ 结论:缓存服务器会解码并规范化路径,触发了缓存规则。 -
如果
X-Cache仍然是miss→ 说明缓存服务器也不解码,这个实验环境对路径遍历的编码不敏感。
-
-
为了完成以上三步,你需要在真实测试中,始终带着两个"探测器":
-
分隔符探测器(Intruder):用于找出源服务器的"盲区"在哪里。
-
缓存探测器(Repeater发两次请求):用于确认某个路径是否被缓存,以及被缓存的路径是什么。
谁(源或缓存)会对路径进行规范化?触发缓存的"开关"(后缀、前缀、分隔符)是什么?

6.说明
本文涉及的所有操作均在 PortSwigger Web Security Academy 提供的官方授权实验靶场中进行。该平台明确授权安全学习者在其环境中进行漏洞复现与攻击模拟。
本文所展示的技术、思路及代码,严禁用于任何未经授权的系统、网络或应用。请勿将文中方法用于非法获取他人数据、破坏系统或侵犯隐私。
读者若将本文内容用于非法用途,由此产生的一切法律后果与责任由读者自行承担,与本文作者无关。
本文旨在帮助安全爱好者理解 Web 缓存欺骗的攻击原理与防御方法。建议读者在理解漏洞成因后,重点学习如何修复与防御,而非仅关注攻击手法。
安全研究,始于责任,终于守护。