1.未过滤或本地过滤
未过滤和本地过滤的共同点是在服务器端都未过滤,这里的未过滤是指没有限制任何格式的文件上传,就是一个简单的文件上传功能。
<?php move_uploaded_file($_file,$files)
2.黑名单扩展名过滤绕过
黑名单的缺点:
1)限制的后缀名不够齐全,上传文件格式不可预测性导致了可能会有漏网之鱼
例如:$savefile=preg_replace('/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i','_\\1\\2',$savefile)
解析asp语言的后缀名.cdx就不在这个列表里,一旦漏洞一个就相当没做限制
2)截断文件名来绕过黑名单限制
例如:1.php%00.jpg //验证后缀名时为jpg, 写入时被%00截断,最终写入1.php
3)验证后缀名的方式存在漏洞可以直接绕过
黑名单payload:
$disallowed_type=array('php','asp','apsx'); //获取不允许上传的文件类型
$fileext=strtolower(getExt($_FILES['file']['name'])); //获取文件扩展名
白名单payload:
this->alowexts=$alowexts; //获取允许上传的类型
$fileext=fileext($file['name']); //获取文件扩展名
例如:"1.php " //后面有一个空格
3.文件头,content-type验证绕过
通过在文件头里面加上GIF89a后上传,则验证通过
payload:
<?php print_r(getimagesize('1.gif'));?> //图片文件头是GIF89a
content-type是在http request的请求头里面,所有这个值可以有请求者自定义修改
payload:
<?php $type=$_FILES['img']['type'];
if(($type=='image/pjpeg')||($type=='image/jpg')||($type=='image/jpeg')||($type=='image/gif')||($type=='image/bmp')||($type=='image/png')||($type=='image/x-png'))
{//uploading}?>