js检讨
一样平常都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
查看源代码可以看到有如下代码对上传文件类型进行了限定:

我们可以看到对上传文件类型进行了限定。
绕过方法
我们直接删除代码中onsubmit事宜中关于文件上传时验证上传文件的干系代码即可。或者可以不加载所有js,还可以将html源码copy一份到本地,然后对相应代码进行修正,本地提交即可。
burp改包,由于是js验证,我们可以先将文件重命名为js许可的后缀名,在用burp发送数据包时候改成我们想要的后缀。即可上传成功
黑名单
分外可解析后缀
这里做了黑名单处理,我们可以通过分外可解析后缀进行绕过。
绕过方法
之前在https://www.jianshu.com/p/1ccbab572974中总结过,这里不再赘述,可以利用php3,phtml等绕过。
上传.htaccess
我们创造黑名单限定了很多后缀名,但是没有限定.htaccess
.htaccess文件是Apache做事器中的一个配置文件,它卖力干系目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、许可/阻挡特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
绕过方法
我们须要上传一个.htaccess文件,内容为:
这样所有的文件都会解析为php,接下来上传图片马即可
后缀大小写绕过
我们创造对.htaccess也进行了检测,但是没有对大小写进行统一。
绕过方法
后缀名改为PHP即可
空格绕过
黑名单没有对文件中的空格进行处理,可在后缀名中加空格绕过。
绕过方法
点绕过
windows会对文件中的点进行自动去除,以是可以在文件末端加点绕过,不再赘述
::$DATA绕过
同windows特性,可在后缀名中加” ::$DATA”绕过,不再赘述
路径拼接绕过
这里对文件名进行了处理,删除了文件名末端的点,并且把处理过的文件名拼接到路径中
绕过方法
这里我们可以布局文件名1.PHP. . (点+空格+点),经由处理后,文件名变成1.PHP.,即可绕过。
双写绕过
绕过方法
这里我们可以看到将文件名更换为空,我们可以采取双写绕过:1.pphphp
白名单
绕过方法
这里检讨Content-type,我们burp抓包修正即可绕过:
%00 截断
$img_path直接拼接,因此可以利用%00截断绕过
绕过方法
然后直接访问/upload/1.php即可
00截断(post)
save_path是通过post传进来的,还是利用00截断,但这次须要在二进制中进行修正,由于post不会像get对%00进行自动解码。
绕过方法
接下来访问1.php即可
文件内容检讨
文件幻数检测
紧张是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下,
要绕过jpg 文件幻数检测就要在文件开头写高下图的值:
Value = FF D8 FF E0 00 10 4A 46 49 46
要绕过gif 文件幻数检测就要在文件开头写高下图的值
Value = 47 49 46 38 39 61
要绕过png 文件幻数检测就要在文件开头写高下面的值
Value = 89 50 4E 47
然后在文件幻数后面加上自己的一句话木马代码就行了
文件干系信息检测
图像文件干系信息检测常用的便是getimagesize()函数
只须要把文件头部分假造好就ok 了,便是在幻数的根本上还加了一些文件信息
有点像下面的构造
GIF89a
(...some binary data for image...)
<?php phpinfo(); ?>
(... skipping the rest of binary data ...)
本次环境中的文件头检测,getimagesize,php_exif都可以用图片马绕过:
copy normal.jpg /b + shell.php /a webshell.jpg
文件加载检测
一样平常是调用API 或函数去进行文件加载测试,常见的是图像渲染测试,乃至是进行二次渲染(过滤效果险些最强)。对渲染/加载测试的攻击办法是代码注入绕过,对二次渲染的攻击办法是攻击文件加载器自身。
对渲染/加载测试攻击- 代码注入绕过
可以用图像处理软件对一张图片进行代码注入
用winhex 看数据可以剖析出这类工具的事理是
在不毁坏文件本身的渲染情形下找一个空缺区进行添补代码,一样平常会是图片的注释区
对付渲染测试基本上都能绕过,毕竟本身的文件构造是完全的
二次渲染
imagecreatefromjpeg二次渲染它相称于是把原来属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了
content-type,以及利用imagecreatefromgif判断是否为gif图片,末了再做了一次二次渲染。
绕过方法
得去找图片经由GD库转化后没有改变的部分,再将未改变的部分修正为相应的php代码。
条件竞争
if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_name = $_FILES['upload_file']['name']; $temp_file = $_FILES['upload_file']['tmp_name']; $file_ext = substr($file_name,strrpos($file_name,\公众.\公众)+1); $upload_file = UPLOAD_PATH . '/' . $file_name; if(move_uploaded_file($temp_file, $upload_file)){ if(in_array($file_ext,$ext_arr)){ $img_path = UPLOAD_PATH . '/'. rand(10, 99).date(\"大众YmdHis\公众).\"大众.\"大众.$file_ext; rename($upload_file, $img_path); $is_upload = true; }else{ $msg = \公众只许可上传.jpg|.png|.gif类型文件!
\"大众; unlink($upload_file); } }else{ $msg = '上传出错!
'; }}
这里先将文件上传到做事器,然后通过rename修正名称,再通过unlink删除文件,因此可以通过条件竞争的办法在unlink之前,访问webshell。
绕过方法
然后不断访问webshell:
上传成功。