PortSwigger靶场之Web shell upload via path traversal靶场通关秘籍

1. 漏洞原理解析

核心问题:

通常,为了防止攻击者上传 Web Shell(恶意脚本),服务器管理员会配置上传目录(例如 /avatars/ 目录),使其禁止执行脚本 。这意味着,即使你成功上传了一个 exploit.php 文件到头像目录,当你访问它时,服务器只会把它当作纯文本或图片显示,而不会运行里面的 PHP 代码。

漏洞逻辑:

在这个靶场中,存在两个关键点:

  1. 上传目录受限/files/avatars/ 目录配置了安全策略,禁止 PHP 执行。

  2. 路径遍历漏洞 :服务器在处理上传的文件名时,没有正确过滤 ../(返回上一级目录)的序列。

攻击思路:

既然 /files/avatars/ 目录下不能执行 PHP,我们就利用路径遍历漏洞,把文件"通过文件名"保存到上一级目录 (例如 /files/)。如果上一级目录没有禁止脚本执行,那么我们的 PHP Web Shell 就可以被激活了。

为什么需要 URL 编码?(本靶场不需要)

很多 Web 应用框架或防火墙会简单的过滤掉标准的 ../ 字符。但是,如果服务器在过滤之后又进行了一次 URL 解码,我们就可以使用 URL 编码后的 ..%2f%2f/ 的编码)来绕过初级过滤。

2. 详细解决流程

步骤 1:准备工作
  1. 点击 ACCESS THE LAB 进入靶场。

  2. 点击右上角的 "My account",使用给定的账号登录:

    • Username: wiener

    • Password: peter

  3. 在我们的本地电脑上创建一个名为 exploit.php 的文件,内容如下(用于读取目标文件):

    复制代码
       <?php echo file_get_contents('/home/carlos/secret'); ?>
步骤 2:尝试上传并抓包
  1. 在 "My account" 页面,找到上传头像的功能。

  2. 选择你刚才创建的 exploit.php 并点击 "Upload"。

  3. 不要直接等待上传完成,在 Burp Suite 中开启 Intercept On (拦截模式),或者、在 HTTP History 中找到刚才的 POST 请求。

  4. 将这个 POST /my-account/avatar 请求发送到 Repeater(重放器)。

步骤 3:测试路径遍历(Bypass 尝试)

我们在 Repeater 中修改请求包。

  1. 找到 Body 中的 Content-Disposition 字段,这里包含了 filename

  2. 尝试 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
  1. 现在文件已经上传到了上一级目录,我们需要访问它来触发代码执行。

  2. 回到浏览器或 Burp Proxy History。

  3. 如果你正常访问头像,路径是 /files/avatars/avatar.png

  4. 根据刚才的上传路径,你的 Web Shell 现在位于 /files/1.php

  5. 在浏览器 URL 栏或 Burp Repeater 中构造 GET 请求:

    复制代码
    GET /files/exploit.php HTTP/1.1
    Host: [你的靶场ID].web-security-academy.net
    ...
  6. 查看响应

    • 如果攻击成功,服务器不会返回 PHP 源码,而是执行代码后的结果。

    • 你应该能在响应体中看到一串随机的字符串,这就是 Carlos 的 Secret。

步骤 5:提交答案
  1. 复制响应中的 Secret 字符串。在靶场页面顶部的 "Submit solution" 按钮处粘贴并提交。

  2. 靶场通关。

总结

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

相关推荐
莞凰5 小时前
昇腾CANN的“灵脉根基“:Runtime仓库探秘
android·人工智能·transformer
NiceCloud喜云6 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
ujainu6 小时前
CANN pto-isa:虚拟指令集如何连接编译与执行
android·ascend
赏金术士7 小时前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
TechMerger8 小时前
Android 17 重磅重构!服役 20 年的 MessageQueue 迎来无锁改造,卡顿大幅优化!
android·性能优化
yuhuofei202111 小时前
【Python入门】Python中字符串相关拓展
android·java·python
dalancon11 小时前
Android Input Spy Window
android
dalancon12 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我1234513 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
天才少年曾牛14 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks