upload-labs关卡文件上传过滤逻辑解析

今天继续给大家介绍渗透测试相关知识,本文主要内容是upload-labs关卡文件上传过滤逻辑解析。

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

一、基本PHP函数解析

在学习文件上传漏洞时,我们要着重学习的是应对站点对于我们上传过滤的绕过,而要想能够绕过目标站点对文件上传的过滤,那么我们就应该学习一些常见的针对文件上传的过滤逻辑。upload-labs作为典型的文件上传漏洞的实战靶场,其过滤和防护逻辑非常经典,因此今天我们就upload-labs黑名单防护部分的防护逻辑进行解析。但是在学习解析逻辑之前,我们先来认识一下upload-labs靶场中常见的过滤使用的PHP函数,主要有以下5个。
1、trim()
trim()函数会移除指定字符串两侧的空白字符或者是其他预订字符。
2、str_ireplace()
str_ireplace()函数会替换字符串中的一些字符。
3、substr()
substr()函数会返回字符串的一部分。
4、strrpos()
strrpos()函数会返回指定字符串在另一字符串的位置。
5、strrchr()
strrchr()函数会查找指定字符串在另一字符串中最后一次出现的位置,并返回从该位置处到末尾的全部字符。
6、deldot()

二、upload-labs关卡过滤逻辑解析

在学习了上述PHP函数之后,我们就可以来简单的看一下upload-labs黑名单防护部分的逻辑了。我们以第三关防护为例(第三关的问题在于黑名单不全面,但是其他方面做的比较好),来介绍该关卡的防护逻辑。第三关关键代码如下所示:
在这里插入图片描述
在上述代码中,代码:

$file_name = trim($_FILES['upload_file']['name']);

会获取上传文件的文件名,并使用trim()函数删除该文件名左右两边的空格(主要是删除右边的空格),之所以要删除空格,是因为如果文件的最后存在空格,那么就可能会对文件后缀名过滤造成影响。
代码:

$file_name = deldot($file_name);

可以删除文件名后面所有的点符号。deldot函数是upload-labs中的一个自定义函数,其函数定义在站点目录下的common.php文件中,函数定义如下所示:
在这里插入图片描述
上述代码是一个循环,$i的初始值是$s的长度值减去1,之后随着循环逐次递减,$c在循环开始时是$s的最后一个字符,之后在循环中会不断向前移动。上述循环会在以下三种情形下结束,第一种即$s全部由点构成,那么该函数不会返回任何数据;第二种即$s最后的字符不是点,那么该函数会直接返回$s;第三种即$s最后的字符是点,那么该函数会删除掉$s后面的点(如果有连续的点,就继续删除,直到$s的最后一个字符不是点为止),然后将删除处理后的字符串返回。
之所以要进行这一步操作,是为了防止客户端在文件的末尾添加点符号,影响后缀名的提取。
代码:

$file_ext = strrchr($file_name, '.');

会找到文件名中最后的点符号的位置,然后提取从该点符号开始剩下的所有内容,即文件的后缀名。
代码:

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

是为了将后缀名全部转化为小写,从而避免了攻击者使用大小写替代的方式来进行绕过。
代码:

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

是为了去除后缀中的“::$DATA”字符串,在Windows操作系统中,如果一个文件的后缀名含有“::$DATA”,那么Windows操作系统会将其作为文件流处理,从而自动删除该内容,从而达到绕过文件后缀名检测的目的。
代码:

$file_ext = trim($file_ext); //收尾去空

是为了在上述所有检测完成后,再次移除文件末尾的空字符串。
从以上分析可知,上述代码尽管在逻辑上非常简单,即采取黑名单的方式对文件的后缀名进行检验,但是为了防止各种各样的文件绕过方式,需要采取各种的过滤措施,才能达到应用的效果。
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

猜你喜欢

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