文件上传漏洞之白名单

白名单:只允许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,如果乱码,直接连菜刀就好了

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值