文件上传漏洞之白名单

Posted 安澈521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传漏洞之白名单相关的知识,希望对你有一定的参考价值。

白名单:只允许XX文件上传

文件上传流程:用户上传文件 ->服务器的缓存目录 ->移动到目标位置并且重命名

URL编码原理:把字符变成16进制,然后加上一个%

URL编码的核心是为了更好的传参

1、%00截断[16进制]

%00实际上代表的是经过了URL编码之后的16进制的00

00在电报中代表着结束,而在php某些版本中也代表着结束

我们查看源码可以知道,只允许上传jpg,png,gif后缀的文件

$is_upload = false;
$msg = null;
if(isset($_POST['submit']))
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr))
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path))
            $is_upload = true;
        
        else
            $msg = '上传失败!';
        
    
    else
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    

我们上传一个文件,然后用Burp抓包,可以看到有一个save_path=../upload/,我们分析源码可以知道,这个意思就是将上传的文件移动到上一层目录的upload的文件夹下,然后在后面会跟上一个/和随机值和当前的时间还有当前你传入文件的后缀名。如果我们在后面加上一个333.php%00,那么我们上传的文件名就会变为 /随机值333.php%00当前时间.jpg,而在php的理解中,在%00这个地方就会截止,实际的文件名就是 /随机值333.php,我们实际操作一下看一看

 我们上传成功以后,复制图片地址,可以看到,因为编码问题,这个%00显示成了�,那我们可以截取http://zmie8016.ia.aqlab.cn/upload/333.php这一段,然后访问,可以看到,成功解析

http://zmie8016.ia.aqlab.cn/upload/333.php�/5620220912063600.jpg

 2、00截断

%00截断和00截断的区别就是传参方式不同,%00是GET传参,我们可以利用URL编码和16进制来直接传00,但是POST传参 他是不会进行URL编码的,查看源码我们可以知道

$is_upload = false;
$msg = null;
if(isset($_POST['submit']))
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr))
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path))
            $is_upload = true;
        
        else
            $msg = "上传失败";
        
    
    else
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    

我们上传一个一句话木马的文件,用Burp抓包,在upload的后面加上一个555.phpa,然后点击Hex,这个模式就是以16进制的角度来看这个数据包,我们在右边找到我们刚才写的555.phpa,然后找到那一行的61,因为a的16进制数字是61,我们将它改为00

 我们上传成功以后,复制图片地址,删除掉php后面多余的字符,即可成功访问

3、图片马绕过

我们之前所说的所有文件上传,都是在文件类型上面做文章,而这个图片马绕过,他是代码去检测图片的本身了,因为你上传一张图片,他是有图片的格式的,之前我们直接改后缀,它的格式是和图片的格式不一样的,我们随便打开一张JPG图片,以HEX模式查看,基本上每一个JPG图片的头部都会是JFIF

 那遇到这种检测怎么办呢?我们可以做一个图片马

我们打开cmd命令行,输入 copy 1.jpg/b + 1.txt  66.jpg ,这个的意思就是将1.jpg和1.txt里面的东西黏到一起,/b的意思是以二进制的方法去黏,变为一个新的66.jpg的图片。注意,这个1.txt里面要放我们的一句话木马,图片的大小尽量要小一点,这个cmd命令行需要在你图片和一句话木马存放的文件夹里面打开

为了保险一点,我们可以给他再加一层, 输入copy 66.jpg/b + 1.jpg/b  88.jpg

当然,我们也可以用这样的方法来藏文件,我们输入 copy 1.jpg + 1.zip  2.jpg

完成之后,我们将后缀改为.zip,然后用好压或者其他的rar应用来打开,就会看到我们所藏的文件了,当然,图片的大小也会随之改变

另外,图片马的食用需要搭配解析漏洞来完成,这个后面会讲到

4、 二次渲染

 二次渲染:获得图片后,给你重新加载,然后重新保存,相当于把你加进去的东西给你祛除了,只保留图片本身,可能是给你压缩、或者裁剪

我们可以用gif图去破,因为二次渲染他只会渲染画面部分,一般动态图片的头部四行不会渲染

我们随便打开一张GIF图片,点击用Hex模式查看,我们在第四行开始写我们的一句话木马

 5、条件竞争

 过滤一般有两种:

        1、先上传,再检测

        2、先检测,再上传

如果是第一种过滤方法的话,就存在条件竞争,因为你检测是需要时间的,如果你上传的够快的话,你就可以利用检测的时间差,在删除之前可以访问得到上传的木马

要想能够访问的到2木马,我们得具备两个条件

        1、单身300年的手速(当然,这就需要一个工具了)

        2、马生马(访问一个木马,生成另一个木马)

由于检测的是我们上传的文件,所以我们上传的文件,再生成的另一个文件,他是不会被检测的

这里我们需要用到一个函数

file_put_contents(文件地址,文件内容)  可以将一个字符串写入文件

        例:file_put_contents('66.php','<?php eval($_REQUEST[8])?>'),这个文件地址就是当前文件夹下

所以我们只需要在上传的文件被删除之前访问到我们上传的文件,他就会再生成一个木马

我们点击上传文件,这里可以直接上传一个一句话木马的文件,然后用Burp抓包,把数据包放到跑包模块lntruder,然后随便框中一个不影响大局的数据,然后在Payloads的Payload type处选中Null payloads,然后在下图中输入一个不小于10000的次数,就可以进行跑包了,当然,访问的时候,我们就是访问我们上传的文件,跟这个操作是一样的,只不过抓的数据包需要换成访问的那个数据包

 6、解析漏洞

上传漏洞的核心:上传一个.php的文件

解析漏洞的核心:让其他后缀的文件当作php来解析

一、IIS6.0解析漏洞:

IIS是一个Web容器(Windows自带),6.0是他的一个版本

asa,cer,cdx的后缀都会默认被当做asp来执行

所以我们可以写一个asp的一句话木马,然后将他的后缀改为jpg,用Burp抓包,再将他的后缀改回cer或者asa或者cdx,知道地址之后,直接用蚁剑或者菜刀连马就好了

IIS解析文件的时候,是从左到右来解析的,如果遇到分号(;),他就会认为结束了,就和00截断是差不多的,我们的文件名需要写成66.asp;.jpg,这样就会被当做ASP来执行了

如果我们传入一个66.asp/1.jpg,IIS读取文件的时候会把66.asp当做文件夹来处理,但是在将这个我们传入的文件解析的时候,这个 / 符号又被当做了一个截断,又会被认为是66.asp,当然,这个利用是需要我们在后台进行文件上传,并且具备移动文件和新建文件夹的功能

二、CGI解析漏洞(PHP特有)

IIS7.0、IIS7.5、nginx可能存在

我们随便上传一张图片、复制图片地址,然后在末尾加上一个/.php,如果乱码了,那就是存在解析漏洞

我们直接上传一个图片马,复制图片地址,在末尾加上/.php,如果乱码,直接连菜刀就好了

WEB安全之文件上传--白名单绕过%00截断

文件上传漏洞介绍:

文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击,它可以危害到我们服务器的安全,上传漏洞是指攻击者上传一个可执行webshell、一句话木马、恶意脚本等,让这些脚本执行后获取服务器的权限。

文件上传之白名单绕过方式:

文件上传白名单绕过分为好几种

例:MIME类型、%00截断、0x00截断、0x0a截断

%00截断

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

%00适用于php>5.3.42,且服务器中的php.ini中的magic_quotes_gpc = Off,才可以进行%00截断

具体方法

这里我们就以upload-labs靶场中的第12关为例,

环境准备:burp、upload第12关

先上传一个jpg文件然后使用burp抓包,

将蓝线部分修改为 …/upload/1.php%00,然后点击上传,%00会把后面的参数结束掉。%00截断就成功了,


我们的服务器上就会多一个1.php的小文件。

搬砖路漫漫,其修远兮。
加油,同道人。

如有更好意见请指出,或私信,接受并会采纳各位的意见和见解。

以上是关于文件上传漏洞之白名单的主要内容,如果未能解决你的问题,请参考以下文章

安全-Pass13之白名单POST型00截断绕过(upload-labs)

安全-Pass12之白名单GET型00截断绕过(upload-labs)

web安全文件上传JS&后缀黑白名单&格式检测

从零开始学安全(二十九)●上传漏洞代码分析

文件上传漏洞代码

第四天——Web安全之文件上传漏洞专题.