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(远程代码执行)。

相关推荐
执明wa9 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder9 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农9 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户693717500138410 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr10 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight11 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼11 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone11 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan11 小时前
Android NDK开发之统计到未被回收的图片
android