文件上传--Upload-labs--Pass03--特殊后缀与::$DATA绕过

简介: 文件上传--Upload-labs--Pass03--特殊后缀与::$DATA绕过

方法一:特殊后缀绕过:

一、什么是特殊后缀绕过

源代码中的黑名单禁止一系列后缀名 之外的后缀,称之为‘特殊后缀名’,利用其来绕过黑名单,达到上传含有恶意代码的文件的目的。


二、代码审计

接下来对代码逐条拆解进行分析:


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

$_FILES是一个超全局变量,用于存储通过HTTP POST上传的文件信息。

‘upload_file’是上传文件的字段名。

['name']为获取上传文件的名称。

trim()函数:用于 去除 字符串前后的空格。

这条代码的作用为:将上传的文件名赋值给 $file_name,并去除其前后两端的空格。


$file_name = deldot($file_name);

deldot()函数:全名 delete dot,用于去除文件末尾的点 。

这条代码的作用为:去除文件名中所有的.,并赋值给 $file_name。


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

strchr()函数:用于查找字符串中最后一次出现指定字符的位置,并返回从该位置开始到字符串末尾的子字符串。

这句代码的作用为:从文件名中提取出 拓展名,并将其赋值给 $file_ext。


$file_ext = strtolower($file_ext);

strtolower()函数:顾名思义,全名 string to lower,将字符串中的所有字符转换为小写,防止不法分子利用大小写漏洞上传含有恶意代码的文件。

这句代码的作用为:将文件拓展名字符串 全部转化为小写。


$file_ext = str_ireplace('::$DATA', '', $file_ext);

str_ireplace()函数:替换函数,将 $file_ext字符串中的 ::$DATA 替换为 空字符。防止$::DATA绕过。


$file_ext = trim($file_ext);

trim()函数在上文已经做出过解释,不再赘述。

这句代码的作用为:去除 拓展名$file_ext首尾的空字符。


if(!in_array($file_ext, $deny_ext))

这句代码的作用为:判断上传文件的拓展名 $file_ext 是否在黑名单 $deny_ext 中。


$temp_file = $_FILES['upload_file']['tmp_name'];

['tmp_name']表示上传文件的 临时文件名。

$temp_file作为一个变量,用来存储临时文件名。

那么临时文件名有什么作用呢?


$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;

UPLOAD_PATH 是一个常量,表示上传文件的存储路径。

date("YmdHis") 获取当前时间,格式为年月日时分秒(例如:20220101123456)。

rand(1000,9999):生成一个四位的随机数。

$file_ext:表示前面获取到的上传文件的 拓展名。

这句代码的作用为:将上传文件的 存储路径,当前时间,一个四位随机数,和文件拓展名 拼接起来,生成一个唯一路径,并将其赋值给 $img_path。


if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }

首先,代码利用 move_upload_file()函数将 临时文件$temp_file 移动到指定路径 $img_path上。 如果文件上传成功,返回true,反之则报错。


三、通关思路


思路:根据源代码中的黑名单,我们只需要让提交文件的后缀名改为黑名单之外的后缀即可。如:php3,php5,phtml等。但是我们需要让我们的 Apache 能够解析这些后缀的文件,并且我们的php版本不可以带nts。

Apache配置方法:1、利用记事本打开Apache配置文件。

2、加上如图这段代码:


通关步骤:

1、上传 test.php,利用 Burpsuite 进行抓包,修改filename为php3或php5或phtml。

2、放包,上传成功,新标签页打开即可,若php版本中带有nts,则可能会出现问题,所以不推荐此方法。


方法二:::$DATA绕过(recommend)

一、什么是::$DATA

在windows操作系统中,当你看到文件名后面跟着 ::$DATA 时,它表示一个文件的附加数据流,数据流是一种在文件内部存储额外数据的机制。

在文件上传漏洞中,::$DATA可以简单理解为 一个通行证,可以冲破黑名单的防线。

二、通关思路

纵使源代码中对字符串中的 ::$DATA 进行了删除,那么我们可以用反删除的知识来破解它,比如双写 ::$DATA。

1、上传test.php,利用 Burpsuite 进行抓包,添加并双写 ::$DATA。


2、放包,文件上传成功。


3、在新标签页中进行打开,出现403,这是因为没有去除 url 中的 ::$DATA。

删除之后,可以正常显示。

相关文章
|
6月前
|
安全 PHP
文件上传--Upload-labs--Pass20--数组绕过
文件上传--Upload-labs--Pass20--数组绕过
|
6月前
|
安全 PHP Windows
文件上传--Upload-labs--Pass07--点绕过
文件上传--Upload-labs--Pass07--点绕过
|
6月前
|
安全 PHP
文件上传--Upload-labs--Pass05--大小写绕过
文件上传--Upload-labs--Pass05--大小写绕过
|
6月前
|
安全 PHP Windows
文件上传--Upload-labs--Pass06--空格绕过
文件上传--Upload-labs--Pass06--空格绕过
|
6月前
|
安全 PHP
文件上传--Upload-labs--Pass11--(GET)00绕过
文件上传--Upload-labs--Pass11--(GET)00绕过
|
6月前
|
前端开发 安全 JavaScript
文件上传--Upload-labs--Pass01--前端绕过
文件上传--Upload-labs--Pass01--前端绕过
|
6月前
|
安全 Apache PHP
文件上传--Upload-labs--Pass09(在某些版本里是Pass10)--点+空格+点 绕过
文件上传--Upload-labs--Pass09(在某些版本里是Pass10)--点+空格+点 绕过
|
6月前
文件上传--Upload-labs--Pass12--(POST)00绕过
文件上传--Upload-labs--Pass12--(POST)00绕过
|
6月前
|
PHP
文件上传--Upload-labs--Pass02--Content-Type绕过
文件上传--Upload-labs--Pass02--Content-Type绕过
|
6月前
|
PHP Apache
文件上传--Upload-labs--Pass10--双写绕过
文件上传--Upload-labs--Pass10--双写绕过