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

相关推荐
xxjj998a38 分钟前
Laravel4.x核心特性全解析
android·mysql·laravel
JoshRen1 小时前
2026教程:在Android Termux中集成Gemini 3镜像站实现移动端文档自动处理与摘要生成(附国内免费方案)
android
诸神黄昏EX2 小时前
Android Google KEY
android
一起搞IT吧2 小时前
Android性能系列专题理论之十一:block IO问题分析思路
android·嵌入式硬件·智能手机·性能优化
小妖6663 小时前
怎么用 tauri 创建编译 android 应用程序
android·tauri
鸟儿不吃草4 小时前
安卓实现左右布局聊天界面
android·开发语言·python
xxjj998a5 小时前
Laravel 1.x:PHP框架的原始魅力
android·php·laravel
formula100005 小时前
在iOS/安卓上远程连接任何 Agent!Claude、Codex、Copilot、Gemini、OpenCode 等
android·copilot
该用户可能存在6 小时前
Blbl-android 更新至 v0.1.24,体验更流畅、更稳定
android·哔哩哔哩·电视app·androidtv·bbll·blbl·bilibilitv
lKWO OMET6 小时前
mysql之字符串函数
android·数据库·mysql