Upload-labs

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。

ps:在搭建靶场时。需要在文件目录手动创建一个名为upload的目录,用于上传文件的存放目录。

Pass 01 修改文件后缀名上传[黑名单]

从源代码可以看出来上传的文件只支持.jpg/.png/.gif类型文件,所以我们选择任意文件作更改后缀名为.jpg为上传对象。选择成功后打开burp,开启代理拦截功能后。进行文件上传, 拦截成功后将拦截信息转发至重发器,并将上传文件的后缀名改成验证不支持的后缀名进行重新上传即可。

 通过服务器也可以看到文件上传成功。并且运行脚本文件。

 Pass 02 修改验证文件类型上传[黑名单]

 从源代码可以看出来上传的文件只支持image/jpeg/png类型文件,这里指的文件类型是服务端检查。不是更改后缀名能改变的。所以,我们上传文件时在burp进行抓包并修改content-type为目标允许上传的文件类型即可,运行上传成功的脚本文件。

 Pass 03 使用php3/php5..上传[黑名单]

从源代码可以看出来上传的文件不只支持.asp/.aspx/.php/.jsp类型文件,我们可以上传.php3或.php5文件进行上传并在服务器查看

 当然php默认是不开启支持php3/php5...类型文件的。我们要想服务端执行需要在php.ini和apache.httpd.conf中进行设置

<IfModule dir_module>
DirectoryIndex index.html index.php index.htm index.php3
</IfModule>

 Pass 04 使用.htaccess上传[黑名单]

 从源代码可以看出来对上传文件进行了更多的限制。但是没有对.htaccess文件限制。

ps:.htaccess文件的意思是将他所在的目录下所有文件当做可执行文件进行执行

<FilesMatch "">
SetHandler application/x-httpd-php
</FilesMatch>

所以我们可以先上传.htaccess文件,然后在将脚本文件 改成目标允许的类型文件进行上传。然后允许脚本文件

我们依然可以使用另外一种方法就是利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性。利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:

双引号"     =   点号.

大于符号>   =   问号?

小于符号<   =   星号*

先上传一个名为hao.php的文件,在burp抓包后对文件名字进行更改为hao.php:.jpg上传成功后会生成hao.php的空文件,大小为0KB.

ps:对于上传来说会识别.jpg。也就是说会把文件当做jpg类型文件进行上传。在windows系统中,会将冒号后面的所有内容去掉

 由于上传的文件大小为0kb,接下来我们执行hao.<<<将数据加载到hao.php中,并执行脚本文件。

 pass 05 利用后缀名大小写上传[黑名单]

 从源代码可以看出来对上传文件进行了更多的限制,但是我们发现

$file_ext = strtolower($file_ext); //转换为小写

  这一句没有了。我们可以件hao.php文件后缀名改为hao.phP进行上传,并允许脚本

 

 Pass 06 利用windows文件名称特性上传[黑名单]

  从源代码可以看出来对上传文件进行了更多的限制,转换为小写也加了回来。那么我们就可以利用windows文件的特性进行上传。

在文件名最后加上空格和点,例如

hao.php .

在选择文件后。进行burp进行抓包。并修改文件名字进行上传

 Pass 07 原理同06一样[黑名单]

 只需要将文件名后面的空格和点换成点和空格即可

 Pass 08 利用::$DATA进行上传[黑名单]

 从源代码中我们发现少了

$file_extstr_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA

 

ps:在window中如果文件名+::$DATA ,会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

 例如:"hao.php::$DATA",Windows会自动去掉末尾的::$DATA变成hao.php

选择脚本文件进行上传,在burp抓包中进行文件名更改为hao.php::$DATA上传并执行脚本文件

 Pass 09 原理同06一样[黑名单]

 从源代码我们发现。这里去除了文件名末尾的点和首位去空,那么在在文件名后加点和空格就行不通了。所以我们需要在文件名加上点+空格+点,并执行脚本文件

hao.php. .

 Pass 10 利用双写后缀名上传[黑名单]

 从源代码我们可以发现。$file_name = str_ireplace($deny_ext,"", $file_name);  如果上传的文件后缀名存在deny_ext中,会将它替换成空且仅进行一次匹配替换。那么我们可以将后缀名进行双写进行上传,将hao.php更改为hao.pphphp,并运行脚本。

ps:ireplace从左到右进行匹配把匹配到的第一个php替换成空

hao.pphphp

 Pass 11 %00截断绕过上传[白名单]

 从源代码我们可以发现这是一个白名单限制。现用burp抓包看一下什么情况。

 通过抓包我们发现这是一个可以指定上传路径的漏洞,那么我们可以使用%00进行截断来上传脚本文件,先将我们的脚本文件后缀名改成目标允许的后缀名。然后在burp抓包后在指定路径的地方进行更改为我们脚本文件本身的后缀名

ps:%00 就是产生一个截断符,将符号后面的所有东西都丢弃,所以上传路径就变成了/upload/Pass-11/index.php?save_path=../upload/hao.php%00hao.jpg

 将我们需要上传的脚本文件写在上传路径上直接上传即可。当然这里需要注意php版本要小于5.3.4,5.3.4及以上已经修复该问题;magic_quotes_gpc需要为OFF状态

 Pass 12 %00截断(16进制)上传[白名单]

 原理同pass 11一样。只不过这里的%00要变成16进制后进行上传文件

 通过抓包后。把我们的脚本文件写在上传路径上并加上空格。然后在用hex进行16进制转换

 将20换成00后。返回,然后上传即可,并在服务器查看执行脚本

 Pass 13 修改文件头进行上传[文件头检测]

 从源代码可以看到。指定上传的文件类型为.jpg/.png/.fig,这里的检测文件类型不是检测文件的后缀名和content-type,是检测我们在上传时候文件头的类型,如图

 所以。我们在选择好脚本文件后。使用burp进行抓包,更改文件的文件头为允许上传的类型即可。

 这里加了GIF89a,定义这个文件为gif类型文件。

 当然,我们还可以使用另外一种方法进行上传,使用工具对图片进行木马植入。将图片拖入到工具中,然后为他添加一句话木马。

 我们在抓包后也能看到文件内容中出现了我们的一句话木马。然后在重发器中进行上传。

 在服务器中也能看到我们上传成功。

 接下来就是运行脚本文件,题目中提示是含有文件包含漏洞,那么我们点击"文件包含漏洞",在跳转页面后,进行参数拼接。

 因为这个文件本身是个jgp文件。所以执行以后是图片内容。我们可以使用剑蚁进行连接。

 

 第一个框就是执行脚本文件的url,第二个框是一句话木马的参数

 Pass 14 原理同pass 13[文件头检测]

 从源代码我们可以看到。这里新增了两个函数。

$info = getimagesize($filename):用于获取图片像素尺寸
image_type_to_extension($info[2]):用于获取图片后缀,索引给出的2表示图像的类型,返回的是数字。其中1 = GIF2 = JPG3 = PNG4 = SWF5 = PSD6 = BMP7 = TIFF(intel byte order)8 = TIFF(motorola byte order)9 = JPC10 = JP211 = JPX12 = JB213 = SWC14 = IFF15 = WBMP16 = XBM
通过burp抓包可以看到,我们上传的是php文件。在文件头更改成gif即可。

 因为还是文件包含漏洞。运行方式和pass 13一样。

 Pass 15 原理同pass 13[文件头检测]

 从源代码可以看出。这里出现了一个exif_imagetype函数。他是php内置函数。用来获取图片类型,所以我们抓包后更改文件头即可。

 Pass 16 二次渲染

 从源代码可以看到imagecreatefromjpeg这个函数。这个函数有个特点,你上传的东西,它给你重新排列,重新把你这个数据读出来,然后在组成一个新的图片,这样子,我们往里面传一句话木马就被丢弃了。

然后用了imagejpeg函数,这个函数的作用,就是往我们的浏览器里面,写新的图片,然后最终要把这个旧的图片删除掉,也就是target_path

我们可以先上传一个已经植入木马的图片,然后尝试用包含漏洞去执行他

 

 我们可以看到在用剑蚁连接的时候返回了空。表示我们上传的木马文件有问题。我们将上传的木马文件保存下来查看

 可以很清楚的发现。我们的一句话木马消失了

那么。我们准备一张没有问题的jpg图片。直接上传,查看一下上传前后图片的情况

 16.gif为普通图片。321.gif为我们上传后下载的图片。我们可以看到白色区域(4-5)直接的内容一样。说明在二次渲染过程中是保留的。所以我们在16.gif中的4-5中加入一句话木马,再次进行上传。

 我们发现在服务器上的文件中一句话木马并没有被去除。接下来利用文件包含漏洞和剑蚁尝试连接。

 Pass 17 利用条件竞争删除文件时间差

 从源代码我们可以看到有两个函数move_uploaded_file和unlink

move_uploaded_file:这个函数把上传的文件移动到新位置。如果成功该函数返回 TRUE,如果失败则返回 FALSE。

 注意:该函数仅用于通过 HTTP POST 上传的文件。如果目标文件已经存在,将会被覆盖。

unlink:这个函数是删除文件。如果成功,该函数返回 TRUE。如果失败,则返回 FALSE

大概意思是检测上传到服务器的文件是否满足白名单内容。如果满足就重命名在存放。不满足就删除,我们知道的是文件会被先上传到服务器才会做检测。

 我们先上传一个gif文件。发现服务器是可以保存的。然后在上传一个php文件进行抓包后转至intruder

 载荷类型我们选择没有载荷。载荷次数我们写到3000次。也就完成3000次的上传操作。

 通过intruder模块可以看到。文件确实会暂时的存在服务器上,那么我们就可以在上传的同时进行访问文件,这就是利用条件竞争删除文件时间差绕过。

我们先准备一个php脚本文件

 

<?php
$myfile = fopen("pass17.php", "w");
$txt = "<?php phpinfo();?>";
fwrite($myfile, $txt);
fclose($myfile);
?>

这段代码的意思是打开一个名为pass17的php文件创建游标,然后将phpinfo()写入,并创建pass17.php,关闭游标

 

因为我们知道上传的文件会存放在upload/upload中,所以。我们访问这个路径。然后进行抓住。转至intruder中,让他无限访问上传的文件

 然后。我们在进行上传脚本文件。

 从图片我们可以很清晰的看到。只要访问的速度够快。就会执行脚本。从而产生新的文件。且在服务器产生的新文件不会被删除

那么我们在重新访问文件存放目录时就会执行新生成的脚本文件

 

 Pass 18 利用Apache + 上传重命名竞争

 从源代码可以看到。会把上传的文件进行时间戳命名,这里我们上传一个1.php.7z文件,并在服务器查看

 那么。我们依然可以利用burp的intruder模块进行快速上传,这里我们设置了50次的上传

 执行结束后。我们可以看到在服务器出现了一个名为upload1.php.7z的文件

 然后利用Apache解析漏洞和文件包含漏洞进行脚本运行和连接,因为当Apache解析不了.7z文件时会向前一位解析。就解析成了upload1.php,执行了脚本文件

 Pass 19 原理同pass 12

 从源代码我们可以看到。move_uploaded_file($temp_file, $img_path)是由temp_file和img_path控制。img_path是由file_name控制。file_name是由save_name决定的。所以我们可以在save_name处进行%00截断绕过上传

先上传图片马,在bupr中抓包可得

 将upload-19.jpg改成19.php+空格,然后在hex中将空格对应的20改成00,进行上传即可

 

 然后执行脚本文件并使用剑蚁进行连接

 Pass 20 利用双文件上传

 从源代码我们可以看到下面函数:

empty() 函数用于检查一个变量是否为空。
explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
end():将内部指针指向数组中的最后一个元素,并输出。
reset():将内部指针指向数组中的第一个元素,并输出。
三运运算符:(expr1) ? (expr2) : (expr3);  如果条件expr1 成立,执行expr2,否则执行expr3;

上传一个白名单图片马文件,通过burp抓包。我们可以进行下面操作

在服务器也可以查看已经上传成功,并使用剑蚁连接成功

 

posted @ 2023-07-18 02:07  __Invoker  阅读(168)  评论(0编辑  收藏  举报