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

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone4 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui