当前位置: 首页 > news >正文

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,点击ApacheMySQL的“启动”按钮(状态灯变绿即成功)。

环境配置问题:

集成开发环境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())。

漏洞分析

  1. 代码逻辑
    • 代码定义了一个允许上传的扩展名列表:var allow_ext = ".jpg|.png|.gif";
    • 当点击上传时,JS 会获取文件名的后缀。
    • 如果后缀不在允许列表中(例如.php),JS 就会弹窗报错alert并阻止提交(return false)。
  2. 核心弱点
    • 验证只发生在浏览器端(前端)。服务器端并没有进行严格的检查(或者这一关故意没写服务端验证)。
    • 只要我们能绕过浏览器的这个 JS 检查,把数据包发送出去,服务器就会接收。

推荐使用Burp Suite 抓包修改法,因为这更符合真实渗透场景。先上传一个1.jpg的 Webshell,利用 Burp 拦截数据包,将文件名改回1.php后放行,即可绕过前端检查并成功写入 PHP 文件。

通关步骤(三种方法)

你可以任选一种方法,推荐方法一最简单。

方法一:修改文件扩展名(最简单)

既然 JS 只检查后缀名是不是 jpg/png/gif,那我们就先骗过它。

  1. 准备 Webshell
    • 新建一个文本文件,写入 PHP 代码:
      <?php @eval($_POST['cmd']);?>

      原本记事本写的,改了后缀:

    • 将其保存为shell.php
  2. 欺骗前端
    • shell.php重命名为shell.jpg(或者是 png、gif 都可以)。
  3. 上传文件
    • 点击“浏览”,选择修改后的shell.jpg
    • 点击“上传”。
    • 结果:如果没有js检查的话,此时会通过,文件上传成功,页面会提示“文件上传成功,保存路径为:...”,
    • 但有js检查的,需要禁用js或者抓包改数据才行
  4. 截断/修改后缀(关键)
    • 此时文件在服务器上确实是.jpg结尾的,无法作为 PHP 执行。
    • 注意:第一关其实有一个隐藏的技巧,或者你需要结合“方法二”来抓包修改。但在第一关的默认配置下,通常只需要禁用JS或者抓包修改才能真正拿到 shell。
    • 修正:仅仅改成jpg上传是不够的,因为服务器虽然接收了jpg,但它不会解析jpg为php。所以方法一必须配合方法二或者方法三才能完成“上传”的任务。

之后的方法一(配合禁用JS):

方法二:禁用 JavaScript(最直观)

既然验证是靠 JS 完成的,那我们不让 JS 运行就行了。

  1. 浏览器设置
    • 如果你用的是 Chrome,可以安装一个插件叫 "Quick JavaScript Switcher",点击图标选择 "Disable"。
    • 或者在浏览器设置里直接禁止当前网站运行 JavaScript。
  2. 上传文件
    • 刷新页面(此时 JS 已失效)。
    • 直接选择你的shell.php文件。
    • 点击“上传”。
  3. 结果
    • 因为没有 JS 阻拦,浏览器直接把.php文件发给了服务器。
    • 页面提示上传成功,并给出路径。
    • 访问该路径,即可连接 Webshell。
方法三:Burp Suite 抓包修改(最专业,推荐掌握)

这是渗透测试中最常用的手法,不需要关闭浏览器功能。

  1. 准备工作
    • 打开 Burp Suite,确保 Proxy -> Intercept 是开启状态(Intercept is on)。
    • 浏览器代理设置好(如果之前搭环境配过就不用动了)。
  2. 构造请求
    • shell.php重命名为shell.jpg(为了骗过前端JS)。
    • 在页面选择shell.jpg,点击“上传”。
  3. 拦截与修改
    • 此时 Burp Suite 会拦截到数据包。
    • 在 Burp 中,你会看到类似filename="shell.jpg"的字段。
    • 将其修改回filename="shell.php"
  4. 放行
    • 点击 "Forward" 发送数据包。
  5. 结果
    • 浏览器收到响应,提示上传成功。
    • 虽然你本地选的是 jpg,但服务器收到并保存的是 php。

总结

第一关的核心知识点:

  • 前端验证(JavaScript)是非常脆弱的,可以被轻易绕过。
  • 防御建议:永远不要只依赖前端验证,必须在服务器端对文件类型、后缀、内容进行全面检查。

可能会出现的问题

问题1:bp还没抓到包呢,就无法上传了

这个弹窗是Windows 系统自带的“Microsoft Defender 智能筛选”拦截了你创建或选择这个文件,它认为你的whell.jpg(里面其实写的是PHP代码)是个病毒。

这导致你在本地根本无法正常选中这个文件,或者文件刚建好就被删除/隔离了。

解决方法(三选一)
方法 A:添加排除项(推荐,最稳妥)

你需要告诉 Windows 的杀毒软件:“在这个文件夹里别乱动我的文件”。

  1. 打开Windows 安全中心(通常在右下角盾牌图标,或者开始菜单搜“病毒和威胁防护”)。
  2. 点击“管理设置”
  3. 向下拉,找到“排除项”->“添加或删除排除项”
  4. 点击“添加排除项”-> 选择“文件夹”
  5. 把你存放whell.jpg的那个文件夹选进去。
  6. 重新创建你的whell.jpg文件,这次就不会报错了。
方法 B:先写无害内容,上传时再改
  1. 先写一个普通的文本文件,里面写 "hello",保存为test.jpg。这时候杀毒软件不会报警。
  2. upload-labs页面点击上传,选中这个正常的test.jpg
  3. 但在点击“上传”按钮之前,迅速用记事本打开test.jpg,把内容改成<?php phpinfo(); ?>并保存。
  4. 立刻点击网页上的“上传”。
  • 原理:利用时间差,让杀毒软件来不及反应。
方法 C:直接禁用 Defender(不推荐,除非你很有把握)

直接在安全中心把“实时保护”的开关关掉。做完实验记得开回来。

搞定这个报错后,你会发现即使上传成功,还是会被网页弹窗拦截(因为第一关是JS验证)。那时候我们再用抓包工具(Burp Suite)或者禁用浏览器JS的方法来搞定它。


问题2:火狐渗透版怎么禁用js

方法一:使用开发者工具(最快,无需插件)

这是最推荐的方法,适合临时禁用。

  1. 按下F12打开开发者工具
  2. 点击右上角的齿轮图标(设置)。
  3. 在“高级设置”或“调试器”栏目下,勾选“禁用 JavaScript”
  4. 保持开发者工具开启,此时刷新页面,JS 即失效,你可以直接上传whell.jpg(内容为 PHP 代码)了。
方法二:使用 NoScript 插件(专业渗透推荐)

火狐渗透版通常预装了NoScript插件,这是安全研究人员的神器。

  1. 查看浏览器右上角工具栏,找到一个“S”形状的图标。
  2. 点击它,选择“禁止所有页面”或直接点击“临时允许”切换状态。
  3. 这能彻底切断脚本运行,比修改配置更灵活。
方法三:修改 about:config(全局永久禁用)

如果你想彻底关闭,可以修改底层配置:

  1. 在地址栏输入about:config并回车,接受风险提示。
  2. 在搜索栏输入javascript.enabled
  3. 双击该选项,将其值从true改为false
  4. 重启浏览器生效。
针对 Pass-01 的替代方案(无需禁用 JS)

其实你不需要禁用 JS 也能过这一关。Pass-01 只是前端检查,你可以:

  1. 选中文件后,不要点上传
  2. 打开Burp Suite开启抓包。
  3. 点击上传,Burp 会截获数据包。
  4. 在 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题的解题步骤和原理

http://www.jsqmd.com/news/799753/

相关文章:

  • BLIVA多模态大模型:专攻图文混合理解,从原理到部署实战
  • 向上取整的原理
  • 如何快速修复Pix2Text ONNX模型文件缺失问题:终极实战指南
  • WIN10下MySQL 8.x配置避坑指南:从my.ini优化到sql_mode精准调校
  • 别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观理解NPN/PNP三极管三种状态
  • ARM异常处理机制与链式管理实践
  • 英雄联盟玩家如何通过自动化工具提升游戏体验:League Akari实战指南
  • Navicat vs DBeaver 连接Oracle 19c:手把手教你搞定远程连接与本地配置(附常见错误排查)
  • 2026届最火的十大AI辅助写作平台解析与推荐
  • 告别乱码与黑屏:FBTFT驱动ST7789屏幕的常见问题排查与修复实录
  • 5分钟掌握layerdivider:AI智能图像分层工具终极指南
  • 别再为蜗壳网格发愁了!手把手教你用ICEM搞定离心泵CFD前处理(附几何修复技巧)
  • Spring Boot 2026教育技术演示项目全栈架构与工程实践解析
  • Midjourney Coca-Cola印相合规性落地手册(含商标使用红线、版权规避清单与平台审核白皮书)
  • 量子模拟新突破:Dicke态方法高效处理集体中微子振荡
  • ANSI转义序列封装:cursor-reset库实现终端光标精准控制
  • 有桥BOOST PFC变换器原理、工作模式和控制模式的优缺点
  • 【每日一题】位运算
  • SAP物料主数据同步PO系统:从IDOC增强到通信配置的保姆级避坑指南
  • 轻量级AI助手miniclawd:本地化、可扩展的TypeScript智能代理实践
  • 京东订单数据本地化备份指南:用开源工具WebCrawl搭建你的个人消费数据库
  • 从开平方到矩阵开方:一文搞懂Matlab里sqrt和sqrtm的区别与选用
  • Arm CoreSight TPIU-M寄存器架构与调试实践
  • 第6节:CLAUDE.md、Skills 与工程规范
  • DenseNet参数量比ResNet少?从Bottleneck和Transition层设计,聊聊模型轻量化的核心思路
  • 别再傻傻分不清!UE5材质里ActorPosition和ObjectPosition到底啥区别?一个地形实验给你讲明白
  • 手把手教你用CH340G和USBasp给自制的Arduino Uno R3烧写Bootloader(附熔丝位避坑指南)
  • 别再只盯着P值了!用SPSS做ANOVA后,这3个关键结果和图表你分析对了吗?
  • WinDirStat插件开发终极指南:构建自定义磁盘管理功能
  • 【紧急预警】Gaussian Splatting社区正被Sora 2协议悄然接管?:6大头部Studio已签署闭源SDK NDA(含实测延迟对比表)