upload-labs靶场通关指南(20-21关)

今天继续给大家介绍渗透测试相关知识,本文主要内容是upload-labs靶场通关指南(20-21关)。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、第20关

(一)代码分析

第20关关键代码及提示如下所示:
在这里插入图片描述
在这里插入图片描述

(二)通关思路

从上述代码以及提示可以看出,在本关中,我们上传的文件的文件名是通过采取post的方式上传save_name参数来决定的,并且采用了黑名单的方式来验证,尽管在本题中黑名单比较完善,但是由于对文件名中的点、空格等处理不到位,因此我们可以借助这一漏洞,上传一个名为exp.php.的文件,这样当该文件存入系统时,系统会自动删除文件最后的点,从而使得该文件的后缀名变化为php。

(三)通关实战

根据以上思路,我们上传一个名为exp.php.的文件,文件可以成功上传,上传后的文件如下所示:
在这里插入图片描述
我们可以访问我们上传后的文件,发现文件可以被作为PHP代码来解析,结果如下所示:
在这里插入图片描述

二、第21关

(一)代码分析

本关关键代码和提示如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)通关思路

在上述代码中,涉及到以下几个关键函数:
1、explode()
explode()函数会以一个字符串去分割另一个字符串,并将字符串分割后的结果存储成一个数组。在上述代码中,该函数的使用如下所示:

explode('.', strtolower($file))

上述命令的执行结果是将file变量变化为小写后,按照其中的点号分割成多个数组。
2、reset()
reset()函数会将数组中的指针指向数组中的第一个元素,并输出第一个元素的值。
3、count()
count()函数可以返回数组中元素的个数。
本关对上传文件的验证有两个单独的方面组成,第一个是验证上传文件的MIME参数,关于这一点,我们可以通过手动修改MIME参数的方式来进行绕过。第二点是对上传文件的文件名进行检查,本题中对文件名的处理逻辑过程如下:
首先,将文件名按照点号来进行分割,最终产生一个数组,然后将数组中第一个元素和最后一个元素提取出来,中间加点号,拼接后形成新的文件名。这样一来,我们就无法使用点号来构造异常的数据包,从而绕过对文件后缀的检验了。
通过本关的思路,我们可以从数组入手,不依赖其本身的数组划分机制,而是我们本身上传的而save_name参数就是一个数组,这样就可以使得我们更加灵活的构造payload了。

(三)通关实战

本关的通关思路有两种,第一种是利用count()函数。count()函数有一个特性,即如果数组中存在空的项,那么在计算数组个数的时候,就不会把空的项计算在内。因此,我们就完全可以利用这一特性。借助空项,来使得在进行函数名拼接的时候,不拼接最后一项,而是拼接中间一项。
我们可以构造如下save_name数组,如:
save_name[0]=“exp”
save_name[1]为空
save_name[2]=“php”
save_name[3]=“jpg”
这样,由于count()函数的特性,最后被拼接的是第0项和第2项,这样文件的后缀名就为php了,这种拼接方式构造的数据包如下所示:
在这里插入图片描述
或者是如下方式构造:
save_name[0]=“exp.php”
save_name[1]为空
save_name[2]=“jpg”
可以简单分析得到,这样构造的数据包也最终拼接的是第0项和第1项,也可以达到预期的效果,这样的数据包构造如下所示:
在这里插入图片描述
第二种方式,则是%00截断。即我们利用%00截断的方式,在数组的第一个元素中,添加一个%00的字符,这样后面无论添加什么内容,都会被舍弃掉,我们就可以把我们想要的文件名和后缀名添加到%00字符的前面了。
这样构造的数据包如下所示:
在这里插入图片描述
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

猜你喜欢

转载自blog.csdn.net/weixin_40228200/article/details/126892252