upload-labs靶场总结

编写人:Rannnn

本总结旨在为正在练习upload-labs的同学们一些头绪和帮助

Pass-01

提示:本pass在客户端使用js对不合法图片进行检查!
解决方法:浏览器禁用javascript或者将判断代码删除即可绕过
漏洞原理:网页前端使用JavaScript代码对不是图片的文件进行后缀检查,只需禁用JavaScript,前端代码就不会检查文件,导致任意文件上传

image-20240716160832339

image-20240716160917334

Pass-02

提示:本pass在服务端对数据包的MIME进行检查!
解决办法:利用BurpSuite抓包,修改MIME为指定文件格式即可绕过
漏洞原理:网页使用后端进行文件检查,但方式是检查MIME信息,且MIME可以伪造,只需将提交文件的数据包抓下,将MIME信息伪造成合法的图片文件信息即可提交,导致任意文件上传

image-20240716161025034
将框内的信息修改为image/jpeg、image/png或image/gif

image-20240716161246804

Pass-03

提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
解决方法:使用php3、php5等文件名即可绕过(前提:服务器需要支持)
漏洞原理:网页使用后端进行黑名单检查,但是黑名单不全,可以通过服务器解析其他文件名(如php3,php5等)进行提交,导致任意文件上传

image-20240716161519329
image-20240716161543382

Pass-04

提示:本pass禁止上传(过滤了好多,但没有了.htaccess)
解决方法:上传.htaccess文件,使其能够解析jpg文件即可绕过
条件:apache配置文件httpd.conf中启用了AllowOverride(AllowOverride All)
漏洞原理:网页后端进行黑名单过滤,黑名单也较全,但是没有过滤.htaccess文件,了解到.htaccess文件是用于解析文件夹内的文件以其定义的方式在网页上显示,只要提前定义好这个文件,进行上传,再上传一个由木马伪装的图片文件,查看是否解析,如解析则可进行攻击

image-20240716162036102

image-20240716162051575

Pass-05

提示:本pass禁止上传(过滤了好多,包括了.htaccess)
解决方法:查看源码,发现没有转换大小写,使用.PHP后缀即可绕过
漏洞原理:网页使用后端进行黑名单检查,黑名单较全,但是查看源码后发现过滤代码没有检查文件大小写,只要将文件转换成大写就可以进行上传,由于Windows系统特性(不区分大小写),所以即使文件后缀大写也可以进行解析。Linux暂未测试

image-20240716162304842

image-20240716162318150

Pass-06

提示:本pass禁止上传(同上)
解决方法:查看源码,发现没有首尾去空,利用BurpSuite抓包,在文件后缀加上一个空格即可绕过
漏洞原理:网页通过后端进行黑名单检查,黑名单较全,查看源码后发现过滤代码没有去除文件名末尾的空格,可以先上传文件,抓取上传文件的数据包,在文件名末尾加上空格,利用Windows系统特性(文件名末尾自动去除空格),上传的文件在进入文件夹之后末尾是没有空格的,导致任意文件上传。Linux系统暂未测试

image-20240716162616023

image-20240716162631560

Pass-07

提示:本pass禁止上传所有可以解析的后缀!
解决方法:查看源码,发现没有删除文件名末尾的点,利用BurpSuite抓包,在文件名末尾加点即可绕过
漏洞原理:网页使用后端进行黑名单检查,黑名单较全,查看源码后发现过滤代码中没有删除文件名末尾的点,可以先上传文件,抓取上传文件的数据包,在文件名末尾加上点,利用Windows系统特性(文件名末尾自动去除点),在文件上传到文件夹之后末尾是没有点的,导致任意文件上传。Linux系统暂未测试

image-20240716163952953

image-20240716162931320

Pass-08

提示:本pass禁止上传(同上)
解决方法:查看源码,发现没有去除字符串::$DATA,利用BurpSuite抓包,在文件名末尾加上::$DATA即可绕过
漏洞原理:网页使用后端进行黑名单检查,黑名单较全,查看源码后发现过滤代码中没有去除字符串::$DATA,了解到在Windows系统中如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,它的目的就是不检查后缀名只需先上传文件,抓取上传文件的数据包,在文件名后加上::$DATA就可以绕过过滤代码检测,导致任意文件上传

image-20240716163212208

image-20240716163229376

Pass-09

提示:本pass只允许上传.jpg|.png|.gif后缀的文件!
解决方法:查看源码,发现空格和点只过滤了一遍,且没有对文件重命名。利用BurpSuite抓包,在文件名末尾加一个空格和点即可绕过
漏洞原理:网页使用后端进行白名单检查,过滤代码详细,但代码中对文件名末尾的空格和点都只过滤了一遍,只需先上传文件,抓取上传文件的数据包,在文件名末尾添加一个空格和点即可导致任意文件上传

image-20240716164033904

image-20240716164046848

Pass-10

提示:本pass会从文件名中去除(黑名单同上),重点:去除而不是禁止上传
解决方法:查看源码,发现只去除一次,利用双写即可绕过
漏洞原理:网页使用后端进行黑名单检查,查看源码发现过滤代码检测到黑名单中的字符后会进行删除,但是只删除一次。只需先上传文件,抓取上传文件的数据包,在文件名末尾进行后缀双写(如.php可双写为.pphphp)即可绕过检测代码,导致任意文件上传

image-20240716164501671

image-20240716164525160

Pass-11

提示:本pass上传路径可控!
解决方法:白名单绕过,%00截断,GET型绕过,在上传路径后面加上php文件名,再将自己上传的php文件名改成其他即可绕过
条件:php版本<5.3.4,php.ini的magic_quotes_gpc为OFF
漏洞原理:网页使用后端进行白名单检查,但发现网站的上传文件路径是以GET方式提交的,只需先上传木马文件,抓取上传文件的数据包,在文件路径后添加随意文件名的php文件(如:123.php),在后缀末尾添加%00进行截断,再将自己上传的文件名后缀修改为其他文件类型(如:jpg、png、gif)通过白名单检测即可绕过所有检测机制,导致任意文件上传

image-20240716164931918

image-20240716165035747

Pass-12

提示:本pass上传路径可控!
解决方法:白名单绕过,%00截断(需要url编码),POST型绕过,在上传路径后面加上php文件名,再将自己上传的php文件名改成其他即可绕过
漏洞原理:本题与上题类似,只不过上传路径的提交方式变为POST类型,只需先上传木马文件,抓取上传文件的数据包,在上传路径末尾添加随意文件名的php文件(如:123.php),在后缀末尾添加%00进行截断,且%00要使用url解码,再将自己上传的文件名后缀修改为其他文件类型(如:jpg、png、gif)通过白名单检测即可绕过所有检测机制,导致任意文件上传

image-20240716165229890

image-20240716165300721

Pass-13

提示:本pass检查图标内容开头2个字节!
解决方法:将文件头修改为对应白名单内的文件头即可绕过
漏洞原理:网站使用后端对文件内容进行白名单检查,但只检查开头两个字节,明显为检查文件头判断文件类型,通过检查$file_type是否存在来进行拦截,可以上传图片马进行绕过。可以使用DOS中的copy命令将图片文件和木马合成为一个图片上传,再通过网页给的文件包含漏洞进行攻击

GIF:

image-20240716165456868

image-20240716165537223

PNG:
image-20240716165633657

JPG:
image-20240716165711649

Pass-14

提示:本pass使用getimagesize()检查是否为图片文件!
解决方法:与上题相同,但木马文件需要以一个正常的图片文件和一个木马php用copy命令合成即可绕过
漏洞原理:过滤代码检查上传文件的图像大小和图像格式,只需上传合成的图片马即可

Pass-15

提示:本pass使用exif_imagetype()检查是否为图片文件!
解决方法:与上题相同
条件:需要服务器开启php_exif扩展模块
漏洞原理:过滤代码读取上传图像的第一个字节并检查其签名,只需上传合成的图片马即可

Pass-16

提示:本pass重新渲染了图片!
解决方法:先上传木马文件,将上传后的文件与源文件进行比对,判断未渲染的地方,将代码插入到没有被渲染的地方即可绕过
漏洞原理:网页后端代码对上传的图片马做了处理,删掉了php代码,或是删掉了包含php代码的部分,这里提供两种方法:

  1. 上传图片马(这里以gif演示)对比上传前和上传后的文件之间的差异,然后将php代码插入未修改的地方

  2. 如果图片上传后先保存为可预知的路径和文件名,然后才进行去除php代码的处理,可以使用条件竞争,不断上传图片,图片中包含写一句话木马文件的php代码,不断利用文件包含漏洞访问图片,触发写一句话木马的语句。以下是图片马中的一句话木马,跟之前的不太一样。

    <? php fputs(fopen('shell.php','w'),'<?php @eval($_POST["123"])?>');?>
    //解释:
    //当浏览器访问这个文件的时候,此文件会在当前目录下创建一个名为shell.php的文件,内容为:
    //<?php @eval($_POST["123"])?>
    //之后就可以通过shell.php这个文件进行攻击

image-20240716170157576

image-20240716170139273

Pass-17

提示:需要代码审计!
解决方法:查看源码,发现其使用move_uploaded_file(),无论上传什么文件,都会先临时保存在服务器上,再通过判断进行重命名保存或删除。可以使用条件竞争方式,使用BurpSuite进行无限重发和其他脚本循环访问,总有一刻服务器会来不及删除文件,这时即可绕过。
漏洞原理:此pass使用的判断代码会将上传的任何文件先放入服务器的临时存放目录,造成安全隐患。攻击者可以使用条件竞争的方式,构造特定的shell语句,无限发送这个木马文件至服务器,同时使用脚本循环访问这个文件,当服务器来不及处理文件的时候,就被攻击者创建了本地shell文件了

image-20240717082950860

image-20240717083035199

image-20240717083105428

image-20240717083532017

image-20240717083603333

Pass-18

提示:需要代码审计!
解决方法:程序来不及rename时通过竞争条件上传shell
BUG:这个关卡的php代码出了些问题,导致它的上传目录为根,且文件名前有upload(人话:上传时php代码内upload后面没加/
漏洞原理:同上,条件竞争

image-20240717095151289

image-20240717095247532

使用BurpSuite抓包无限重发,再使用python脚本进行循环访问

image-20240717095501674

image-20240717100109628

Pass-19

提示:本pass的取文件名通过$_POST来获取。
解决方法:通过CVE-2015-2348漏洞,在文件名后添加./进行截断即可绕过
漏洞原理:此pass的文件名由用户自己填写,但判断代码move_uploaded_file的目的路径参数可以使用空字符截断,绕过jpg,png上传类型的检测,从而导致任意文件上传。检查代码后发现在高版本(受影响版本中),PHP把长度比较的安全检查逻辑给去掉了,导致了漏洞的发生。漏洞代码为CVE-2015-2348

image-20240717091041216

image-20240717091104302

image-20240717091114514

Pass-20

提示:Pass-20来源于CTF,请审计代码!
解决方法:这里我们可以定义一个数组,利用如下代码构造数组来绕过

$file_name = reset($file) . '.' . $file[count($file) - 1];

正常上传一句话(这里需要将一句话改成图片文件来绕过MIME校验)
image-20240717092226917

使用BurpSuite修改数据包
image-20240717092653730

image-20240717092722671

image-20240717092744891

漏洞原理:前面MIME的校验很好绕过,关键是这句$file_name = reset($file) . '.' . $file[count($file) - 1];,文件名的组成是打散后的第一个元素+点+最后一个数组元素,用户可控的就是元素值,而且元素值是以点区分的。再往前看,if (!is_array($file))这句话有点奇怪,为什么要判断文件名是不是数组呢?如果上传的文件名本来就是数组,那这句话就能绕过,而且数组内容用户可以自己定制。所以直接将文件名改为数组,从而绕过了数组打散,而save_name[2]中的jpg也可以绕过后缀白名单的过滤,文件名形成的后缀是索引为数组长度减一的元素save_name[1],而save_name[1]我们没有设置,所以直接为空。最后文件名拼接应该为ma.php. ,此时由因为windows的特性(自动去除文件名末尾的点),会在保存文件时自动去除后缀末尾的点。

Pass-20特点:本关来自真实CTF,突破点主要在if (!is_array($file))$file_name = reset($file) . '.' . $file[count($file) - 1];这两句话,比较特殊的是构造一个数组文件名绕过,并且结合Windows的特性。

结束,下播!