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

相关推荐
消失的旧时光-19439 小时前
Android ADB指令大全详解
android·adb
ashcn200111 小时前
opengl 播放视频的android c++ 方案
android·c++ opengl es
abner.Li11 小时前
android 反编译
android
Digitally11 小时前
如何删除 realme 手机上的短信
android
2501_9160088911 小时前
提高 iOS 应用逆向难度的工程实践,多工具联动的全栈安全方案
android·安全·ios·小程序·uni-app·cocoa·iphone
沐怡旸12 小时前
【底层机制】Android图形渲染体系深度解析:VSync信号机制
android·面试
BoomHe12 小时前
Android 13 (API 33)上自定义广播
android
来来走走13 小时前
Android开发(Kotlin) ViewModel基本用法
android·开发语言·kotlin
Digitally14 小时前
在荣耀手机上删除短信的完整指南
android