ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Upload-Labs通关秘籍:全视角攻克文件上传难题

2026/8/17 3:58:31 拓冰建站 浏览量
Upload-Labs通关秘籍:全视角攻克文件上传难题

目录

  • 一、引言
  • 二、环境搭建与准备
    • 2.1 环境搭建
    • 2.2 工具准备
  • 三、关卡攻略
    • 3.1 第一关:突破前端 JS 校验防线
    • 3.2 第二关:绕过 MIME 类型验证
    • 3.3 第三关:巧用黑名单规则漏洞
    • 3.4 第四关:.htaccess 文件解析利用
    • 3.5 第五关:大小写绕过技巧
    • 3.6 第六关:空格绕过策略
    • 3.7 第七关:点号绕过方法
    • 3.8 第八关:利用::$DATA 特性
    • 3.9 第九关:构造后缀绕过
    • 3.10 第十关:双写后缀绕过
    • 3.11 第十一关:%00 截断(GET 型)
  • 四、总结与思考


一、引言

在网络安全的领域中,文件上传漏洞一直是攻击者手中的 “利器”,upload - labs 则是专门为研究这类漏洞而设计的绝佳靶场。它就像是一个网络安全的 “练兵场”,涵盖了各种各样文件上传漏洞的场景,为安全爱好者和专业人士提供了一个深入学习和实践的平台。

文件上传漏洞的危害不容小觑。一旦服务器存在这类漏洞,攻击者就如同拿到了一把 “万能钥匙”,能够越过正常的权限限制,将恶意的动态脚本文件上传到服务器。这些恶意文件可能是隐藏在暗处的木马程序,悄无声息地窃取服务器中的敏感信息;也可能是破坏力极强的病毒,瞬间让服务器陷入瘫痪;或者是功能强大的 WebShell,让攻击者能够随心所欲地控制服务器,进行诸如篡改网页内容、窃取用户数据、植入更多恶意软件等一系列危险操作。

接下来,本文将带领大家深入探索 upload - labs 的每一关,从漏洞原理的剖析,到具体绕过方法的实践,帮助大家全面掌握文件上传漏洞的相关知识和应对技巧。无论是初涉网络安全领域的新手,还是经验丰富的安全专家,相信都能从这份攻略中收获有价值的信息。

二、环境搭建与准备

2.1 环境搭建

  • 软件准备
    • phpstudy:这是一款非常实用的 PHP 调试环境程序集成包,它将 Web 服务器(如 Apache、Nginx)、PHP 解释器以及数据库(如 MySQL)等进行了整合,极大地简化了 Web 开发和测试环境的搭建过程 。对于 upload - labs 来说,它为整个靶场提供了必要的 PHP 运行环境和服务器支持,就像是搭建高楼大厦的地基。可以从 phpstudy 官方网站(https://www.xp.cn/ )下载最新版本。
    • upload - labs 源码:从 GitHub 上的项目地址(https://github.com/c0ny1/upload-labs )下载 upload - labs 的源码压缩包,这是我们进行文件上传漏洞学习和实践的核心 “剧本”,里面包含了精心设计的各种漏洞场景。
  • 搭建步骤
    • 下载并安装 phpstudy,安装过程比较简单,一路点击 “下一步” 即可完成基本安装。安装完成后,启动 phpstudy,在主界面中可以看到 Apache 和 MySQL 的启动按钮,确保它们都处于正常启动状态。这就好比启动了一个网站运行的 “发动机” 和 “仓库”,让整个环境能够正常运转起来。
    • 将下载好的 upload - labs 源码压缩包解压,然后把解压后的文件夹完整地复制到 phpstudy 安装目录下的 WWW 文件夹中。这个 WWW 文件夹就像是一个展示网站内容的 “舞台”,我们把 upload - labs 的 “表演道具” 放置在这里。
    • 配置 PHP 版本,在 phpstudy 的设置中,建议将 PHP 版本切换为 5.2.17。因为 upload - labs 在这个版本下能够更好地展现出各种文件上传漏洞的场景,就像不同的舞台灯光效果,能让我们更清晰地看到漏洞的 “真面目”。
    • 打开浏览器,在地址栏中输入 “http://localhost/upload - labs/”(如果修改了端口或者路径,需要根据实际情况调整),如果一切顺利,就可以看到 upload - labs 的界面,至此环境搭建成功。

2.2 工具准备

  • Burp Suite:这是一款功能强大的 Web 应用程序安全测试工具,被誉为网络安全领域的 “瑞士军刀”。它可以在浏览器和目标 Web 应用程序之间充当中间人,拦截、查看和修改 HTTP/HTTPS 请求和响应数据包。在 upload - labs 的学习中,我们主要利用它来抓取文件上传时的数据包,分析其中的内容,比如文件类型、文件名、文件内容等信息,并对这些信息进行修改,尝试绕过服务器的上传限制,就像一个 “数据包黑客”,在网络数据传输的通道中进行巧妙的 “小动作” 。例如,当服务器通过前端 JavaScript 对上传文件类型进行校验时,我们可以利用 Burp Suite 拦截上传请求,将文件类型修改为合法的类型,从而绕过前端校验。
  • 蚁剑:它是一款开源的 WebShell 管理工具,专门用于与 WebShell 进行交互,就像是黑客手中的 “远程控制终端”。当我们成功上传恶意的 WebShell 文件到服务器后,蚁剑可以帮助我们连接到这个 WebShell,获取服务器的权限,执行各种操作,如查看服务器文件、执行系统命令、上传下载文件等 。在 upload - labs 中,一旦我们利用文件上传漏洞上传了 WebShell,就可以使用蚁剑来连接并进一步探索服务器,检验漏洞利用的效果。
  • Notepad++:这是一款免费的开源文本编辑器,它具有语法高亮、代码折叠、自动完成等丰富的功能,非常适合用于编辑各种代码文件。在 upload - labs 中,我们可能需要修改一些代码文件,例如编写恶意的 PHP 脚本作为上传文件,或者分析服务器端的 PHP 代码来了解其上传校验逻辑,Notepad++ 就可以为我们提供一个方便的代码编辑环境,让我们能够轻松地对代码进行修改和调试。

三、关卡攻略

3.1 第一关:突破前端 JS 校验防线

在第一关中,upload - labs 采用了前端 JavaScript 校验机制来限制文件上传类型。当我们试图上传非指定类型(如.jpg、.jpeg、.png)的文件时,浏览器会弹出提示框,阻止上传操作。这是因为前端代码中的checkFile函数会在文件上传前对文件后缀名进行检查 。例如,在页面的 HTML 代码中,可能会有类似这样的 JavaScript 代码:

function checkFile() {var file = document.getElementsByName('upload_file')[0].value;if (!file.match(/.jpg|.jpeg|.png$/i)) {alert('只允许上传.jpg/.jpeg/.png后缀名的文件');return false;}return true;
}

这种前端校验机制虽然能在一定程度上阻止用户误上传非法文件,但它存在明显的缺陷,因为前端代码是在用户浏览器端执行的,用户可以轻松绕过。

  • 禁用 JS 绕过方法
    • 以 Firefox 浏览器为例,我们可以在地址栏输入about:config,然后在搜索框中输入javascript,找到javascript.enabled选项,将其值改为false,这样就禁用了浏览器的 JavaScript 功能 。此时再回到 upload - labs 的第一关页面,上传包含恶意代码的 PHP 文件,就可以成功绕过前端校验,实现文件上传 。例如,我们可以准备一个简单的 PHP 一句话木马文件,内容为<?php @eval($_POST[‘shell’]);?>,然后尝试上传,会发现可以顺利上传到服务器。
  • 抓包修改后缀绕过方法
    • 利用 Burp Suite 抓包工具。首先启动 Burp Suite,并配置浏览器代理,将浏览器的代理地址设置为 Burp Suite 的代理地址(一般为127.0.0.1:8080) 。然后在 upload - labs 第一关页面上传一个合法的 jpg 图片文件,在点击上传按钮的瞬间,Burp Suite 会拦截到这个上传请求。
    • 在 Burp Suite 的拦截界面中,找到上传文件的相关信息,将文件名的后缀从.jpg修改为.php,然后点击 “Forward” 放行数据包 。这样,服务器就会接收并保存这个被修改后缀的文件,实现了绕过前端校验上传 PHP 文件的目的 。上传成功后,我们可以使用蚁剑等 WebShell 管理工具,连接这个上传的 PHP 文件,输入连接密码(在上面的一句话木马中为shell),就可以成功获取服务器的权限,执行各种系统命令。

3.2 第二关:绕过 MIME 类型验证

第二关主要通过检查上传文件的 MIME 类型来限制文件上传。MIME(Multipurpose Internet Mail Extensions)类型是一种用于标识文件类型的标准,在 HTTP 请求中,通过Content-Type字段来表示文件的 MIME 类型 。例如,常见的图片文件的 MIME 类型有image/jpeg(对应.jpg 和.jpeg 文件)、image/png(对应.png 文件)、image/gif(对应.gif 文件),而 PHP 文件的 MIME 类型通常是application/x - php 。在第二关的服务端代码中,会检查上传文件的Content-Type字段,只有当它是image/jpeg、image/png或image/gif时,才允许文件上传 。例如,PHP 代码可能如下:

if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH. '/'. $_FILES['upload_file']['name'];if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '文件类型不正确,请重新上传!';}} else {$msg = UPLOAD_PATH. '文件夹不存在,请手工创建!';}
}
  • 抓包修改 Content-Type 绕过方法
    • 首先使用 Burp Suite 抓包工具,确保其处于拦截状态,并配置好浏览器代理 。准备一个包含恶意代码的 PHP 文件,比如<?php @eval($_POST[‘cmd’]);?>,然后在 upload - labs 第二关页面上传这个 PHP 文件。
    • Burp Suite 拦截到上传请求后,在请求数据包中找到Content-Type字段,将其值从application/x - php修改为image/jpeg(也可以是image/png或image/gif) 。修改完成后,点击 “Forward” 放行数据包。
    • 服务器接收到修改后的数据包后,会因为Content-Type被伪装成合法的图片类型,而允许文件上传 。上传成功后,通过访问上传文件的路径,就可以使用蚁剑等工具连接这个 PHP 文件,执行系统命令,如输入whoami查看当前服务器的用户名。

3.3 第三关:巧用黑名单规则漏洞

第三关采用了黑名单验证机制,服务端代码会检查上传文件的后缀名,禁止上传.asp、.aspx、.php、.jsp后缀的文件 。例如,PHP 代码实现如下:

if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array('.asp', '.aspx', '.php', '.jsp');$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name); //删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext);$file_ext = str_ireplace('::$DATA', '', $file_ext);$file_ext = trim($file_ext);if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH. '/'. date("YmdHis"). rand(1000, 9999). $file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';}} else {$msg = UPLOAD_PATH. '文件夹不存在,请手工创建!';}
}

然而,这种黑名单验证存在局限性,因为 PHP 还有其他一些等价的后缀名,如.php1、.php2、.php3、.php5、.phtml等,这些后缀在某些服务器配置下也会被当作 PHP 文件解析。

  • 特殊后缀绕过操作
    • 我们可以将恶意 PHP 文件的后缀名修改为php3或php5等未被列入黑名单的后缀。比如,将一句话木马文件shell.php重命名为shell.php3。
    • 然后在 upload - labs 第三关页面上传这个重命名后的文件。服务器会因为文件后缀不在黑名单中,而允许文件上传。上传成功后,通过访问上传文件的路径(例如http://localhost/upload - labs/upload/202401011200001234.php3,其中202401011200001234是根据代码中生成的时间和随机数部分),就可以使用蚁剑连接这个文件,获取服务器权限。

3.4 第四关:.htaccess 文件解析利用

第四关同样采用黑名单验证,禁止上传常见的危险脚本文件后缀。不过,这一关没有过滤.htaccess文件后缀名。.htaccess文件是 Apache 服务器的配置文件,它可以对所在目录下的文件进行特殊的配置,比如将某个文件类型解析为 PHP 脚本执行。例如,在.htaccess文件中添加如下内容:

<FilesMatch "test.jpg">SetHandler application/x-httpd-php
</FilesMatch>

这段代码的作用是将名为test.jpg的文件当作 PHP 脚本解析。

  • 上传.htaccess 文件和图片马操作
    • 首先准备一个.htaccess文件,按照上述规则编写内容,将我们即将上传的图片文件(假设名为shell.jpg,且里面包含一句话木马<?php @eval($_POST[‘cmd’]);?>)配置为以 PHP 脚本执行。
    • 在 upload - labs 第四关页面上传这个.htaccess文件。上传成功后,再上传包含一句话木马的shell.jpg文件。
    • 由于.htaccess文件的配置,服务器会将shell.jpg当作 PHP 文件解析 。此时,我们可以使用蚁剑,通过访问shell.jpg的路径(如http://localhost/upload - labs/upload/shell.jpg),输入连接密码(这里为cmd),就可以成功连接并控制服务器。

3.5 第五关:大小写绕过技巧

第五关的服务端代码在进行后缀名验证时,没有将文件名强制转换为小写。这就给我们提供了大小写绕过的机会 。例如,正常情况下,服务器会检查文件后缀是否为.php,但如果我们将后缀写成.Php,由于代码没有统一大小写,就可能绕过验证。

  • 大小写混合后缀绕过方法
    • 准备一个包含恶意代码的 PHP 文件,比如<?php @eval($_POST[‘pass’]);?>。
    • 在 upload - labs 第五关页面上传这个文件,使用 Burp Suite 抓包 。在抓包界面中,将文件名的后缀从.php修改为.Php。
    • 点击 “Forward” 放行数据包,服务器会因为后缀名大小写的差异,而允许文件上传。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,执行系统命令,如输入ls查看服务器当前目录下的文件列表。

3.6 第六关:空格绕过策略

第六关的代码在处理文件名时,没有去除文件名前后的空格。这就导致我们可以利用空格来绕过文件后缀名的验证。例如,服务器在验证文件后缀时,可能只检查文件名中间部分的后缀,而忽略了前后的空格 。

  • 抓包加空格上传绕过操作
    • 准备好恶意 PHP 文件,如一句话木马<?php @eval($_POST[‘test’]);?> 。
    • 在 upload - labs 第六关页面上传这个文件,同时使用 Burp Suite 抓包 。在抓包界面中,找到文件名部分,在文件名末尾添加一个空格,例如将shell.php修改为shell.php。
    • 点击 “Forward” 放行数据包,服务器会因为没有对文件名前后空格进行处理,而允许文件上传。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,执行各种操作,如上传下载文件等。

3.7 第七关:点号绕过方法

第七关的代码没有过滤文件名末尾的点号。在 Windows 系统中,文件名末尾的点号会被自动忽略。我们可以利用这一特性,在文件名末尾加点号来绕过文件后缀名的验证。

  • 抓包加点上传绕过方法
    • 准备包含恶意代码的 PHP 文件,例如<?php system($_GET[‘cmd’]);?> 。
    • 在 upload - labs 第七关页面上传该文件,利用 Burp Suite 抓包 。在抓包界面中,将文件名修改为在末尾加点号的形式,如将shell.php修改为shell.php.。
    • 点击 “Forward” 放行数据包,服务器会因为代码没有过滤文件名末尾的点号,而允许文件上传。在 Windows 系统下,文件实际保存时会忽略末尾的点号,最终文件会以shell.php的形式保存。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,通过 URL 参数输入命令,如http://localhost/upload - labs/upload/shell.php?cmd=whoami来查看服务器用户名。

3.8 第八关:利用::$DATA 特性

在 Windows 系统中,当文件名后加上::$DATA时,系统会把::$DATA之后的数据当作文件流处理,不会检测后缀名 。第八关的代码没有对::$DATA进行处理,我们可以利用这一特性绕过文件后缀名验证。

  • 抓包加::$DATA 上传绕过操作
    • 准备恶意 PHP 文件,如<?php @eval($_POST[‘code’]);?> 。
    • 在 upload - labs 第八关页面上传该文件,使用 Burp Suite 抓包 。在抓包界面中,将文件名修改为添加::$DATA的形式,比如将shell.php修改为shell.php::$DATA。
    • 点击 “Forward” 放行数据包,服务器会因为没有处理::$DATA,而允许文件上传。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,输入连接密码(这里为code),实现对服务器的控制。

3.9 第九关:构造后缀绕过

第九关的代码在处理文件名时,会删除文件名末尾的点号,并去除文件名前后的空格 。我们可以利用 Windows 系统的特性,构造特殊的文件名后缀来绕过验证 。例如,构造php. .(中间有空格)这样的后缀,代码会先删除末尾的点号,再去除空格,最终得到的后缀是php.,而在 Windows 系统中,php.会被当作php文件处理。

  • 点空格点构造后缀绕过方法
    • 准备恶意 PHP 文件,如<?php echo shell_exec($_GET[‘cmd’]);?> 。
    • 在 upload - labs 第九关页面上传该文件,使用 Burp Suite 抓包 。在抓包界面中,将文件名修改为构造的后缀形式,比如将shell.php修改为shell.php. . 。
    • 点击 “Forward” 放行数据包,服务器会按照代码逻辑处理文件名,最终文件会以shell.php的形式保存(因为 Windows 系统的特性) 。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,通过 URL 参数输入命令,如http://localhost/upload - labs/upload/shell.php?cmd=dir来查看服务器当前目录下的文件列表。

3.10 第十关:双写后缀绕过

第十关的服务端代码使用了str_ireplace函数来替换文件名中的非法后缀。例如,当文件名中包含.php时,会将其替换为空。但是,我们可以利用双写后缀的方法来绕过这个验证。比如,将.php写成.pphphp,当str_ireplace函数替换第一次php后,文件名中还剩下.pphp,这样就绕过了验证。

  • 双写后缀绕过原理和操作
    • 准备恶意 PHP 文件,如<?php @eval($_POST[‘exec’]);?> 。
    • 在 upload - labs 第十关页面上传该文件,使用 Burp Suite 抓包 。在抓包界面中,将文件名的后缀修改为双写形式,比如将shell.php修改为shell.pphphp。
    • 点击 “Forward” 放行数据包,服务器会因为双写后缀的存在,在替换一次后仍保留了可执行的后缀,而允许文件上传 。上传成功后,通过访问上传文件的路径,就可以使用蚁剑连接这个文件,输入连接密码(这里为exec),执行各种系统命令。

3.11 第十一关:%00 截断(GET 型)

在第十一关中,涉及到%00截断漏洞。%00在 URL 中表示 ASCII 码中的空字符(NULL)。在 PHP 中,当magic_quotes_gpc为 Off 状态(PHP 5.3 之前默认是 Off),并且在处理文件上传时,文件保存路径由用户可控(通过 GET 参数传递)时,就可能存在%00截断漏洞。例如,代码中可能有如下获取文件保存路径的方式:

$save_path = $_GET['save_path']. '/'. $_FILES['upload_file']['name'];

如果save_path参数可以被我们控制,我们就可以在其后面添加%00来截断字符串,使得服务器认为文件名到%00处就结束了。

  • %00 截断操作及条件
    • 首先确认服务器的magic_quotes_gpc为 Off 状态,并且文件保存路径由 GET 参数可控 。准备一个恶意 PHP 文件,如<?php @eval($_POST[‘command’]);?> 。
    • 在 upload - labs 第十一关页面,将文件上传表单中的save_path参数设置为我们想要保存文件的路径,然后在路径后面添加%00和我们想要的文件名(这里为恶意 PHP 文件名,如shell.php),例如save_path=/upload/%00shell.php。
    • 上传文件,服务器会因为%00截断,将文件保存为/upload/shell.php(忽略%00后面的内容)。

四、总结与思考

通过对 upload - labs 各个关卡的逐一攻克,我们系统地学习了文件上传漏洞的多种类型以及相应的绕过技巧。从前端 JS 校验的简单绕过,到利用服务器配置、系统特性和代码逻辑漏洞进行复杂的绕过操作,每一关都像是一场精心设计的 “攻防演练”,让我们深入理解了文件上传漏洞的原理和危害。

在实际的网络安全防护中,理解文件上传漏洞的原理是至关重要的。只有深入了解攻击者可能利用的漏洞点,才能针对性地采取有效的防范措施 。同时,我们不能仅仅满足于掌握已知的绕过方法,更要学会举一反三,不断探索新的漏洞利用方式和防范策略 。因为网络安全的环境是不断变化的,攻击者也在不断寻找新的攻击途径,我们必须保持敏锐的洞察力和持续学习的态度。

展望未来,文件上传漏洞的研究仍然具有重要的意义。随着新技术的不断涌现,如容器技术、无服务器架构等,文件上传漏洞可能会以新的形式出现 。我们需要密切关注这些技术的发展,深入研究在新环境下文件上传漏洞的特点和防范方法 。同时,加强对网络安全意识的培养,无论是开发者还是用户,都应该认识到文件上传漏洞的危害,从源头减少漏洞的产生 。只有这样,我们才能在这场网络安全的 “持久战” 中,始终保持领先地位,保护好网络世界的安全。