文件解析安全问题上,格式解析是一对一的(不能jpg解析php),换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析。
文件上传漏洞
程序或系统未对上传文件作全面的限制,导致用户可以上传某些非法文件(木马,webshell,病毒等)
漏洞点分析
1、前端JS验证漏洞
前端验证判断(笨办法):首先抓包监听,如果上传文件的时候还没有抓取到数据包,但是浏览器就提示文件类型不正确的话,那么这个多半就是前端校验了。
绕过方法:
以正确规则上传文件,Bp截包更改后发送。
关闭浏览器JavaScript功能
2、.htaccess(分布式配置文件)
.htaccess文件是apache的分布式配置文件。他负责相关目录下的网页配置,可以帮我们实现:网页301重定向,自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、封禁特定IP地址的用户,只允许特定IP地址的用户,以及使用其他文件作为index文件配置默认文档等功能。
htaccess文件按照查找顺序依次生效,子目录会覆盖父目录目录或者主配置文件中的指令。
绕过方法:
1.匹配文件名为“shell”的文件,该文件作为可执行程序解析
<FilesMatch "shell">
SetHandler application/x-httpd-php
</FilesMatch>
2.jpg文件作为可执行程序执行
<FilesMatch "shell">
AddType application/x-httpd-php .jpg
</FilesMatch>
同理得 .user.ini 【只要是以 fastcgi 运行的php都可以使用这种方法】,如果某网站不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。
简单来说,PHP会从当前目录往上一直到根目录扫描INI文件,默认每300s扫描.user.ini并重新加载。
绕过方法:
auto_prepend_file 在页面顶部加载文件
auto_prepend_file 在页面底部加载文件
#两者没啥大的区别,一个在页面上方显示,应该在页面下方显示
也就是说若当前目录存在一个正常的php文件,一个.user.ini文件,一个随便什么php文件,如果.user.ini中写了
auto_prepend_file=xxx.xxx
那么这个正常的php文件就会去自动包含xxx.xxx从而达到getshell的目的。
3、MIME类型
正常上传文件会在数据包中看见一个字段用来定义所上传的文件是什么类型【Content-Type】
绕过方法:、
如果服务器后端对此MIME头进行检测,为“image/jpeg”"image/png" "image/gif"则验证通过可以上传,那么可以通过替换为正常上传文件的MIME头来达到规避检查的效果。
常见的文件上传类型的:
text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)
application/(编程语言) 该种语言的代码
application/x-www-form-urlencoded(POST方法提交的表单)
multipart/form-data(POST提交时伴随文件上传的表单)
4、文件头\文件尾判断
不同文件格式具有不同的文件头部部分也有文件尾特征,可以通过16进制进行判断,通常来说常见的文件头尾例如:
通过对上传文件的文件头十六进制进行判断,也可验证其是否合法。伪装方法可以直接以16进制进行更改。
5、黑名单拓展名绕过
(1)拓展名列表可能过滤不严格,存在漏网之鱼——比如iis 6.0中的asa和cer
(2)大小写绕过——iis 6.0 中的aSp和linux环境中php小于5.3版本的pHp
(3)能被Web容器解析的文件例如:
jsp,jspx,jspf,asp,asa,cer,cdx,htr,xml,html,aspx,ashx,asmx,asax,ascx等
(4)特殊后缀名绕过
将Burpsuite截获的数据包中php名字改为php4(php1,php2,php3,php4,php5),前提条件是http.conf中设置 AddType application/x-httpd-php .php1(php的版本小于等于5.3.29以下)
(5)利用操作系统文件命令的特性
在windows系统下,如果文件名以“.”或者空格作为结尾,系统会自动删除“.”与空格,利用此特性也可以绕过黑名单验证。apache中可以利用点结尾和空格绕过,asp和aspx中可以用空格绕过。
同时在文件名后加上 ::$DATA 之后的数据会被当做数据流过滤掉,同样可以作为绕过方法。
(6)若对后缀名的过滤方法为:将黑名单中的非法字符过滤为空,利用其逻辑漏洞可以通过双写绕过。
6、白名单绕过
(1)配合Web框架解析漏洞
1、IIS6/7·在IIS6.0下存在这样的文件“名字.asp;名字.jpg”代表了jpg文件可以以asp脚本类型的文件执行。asp一句话木马(<%eval request ("pass")%>)·以“xxx.asp”的文件夹里面,里面的文件会以asp脚本运行。
2、Apache解析漏洞--低版本遇到不识别的后缀名,向前解析Apache1.x/2.x解析漏洞,Apache从右向左解析文件,如果不认识就向左挪,比如1.php.abc是个的文件, abc类型的apache不认识,因此就会被解析为php文件,相当于1.php。
(2)%00截断上传绕过
通过抓包截断将 1.asp.jpg 后面的一个.换成%00在上传的时候即1.asp%00jpg,当文件系统读到%00时,会认为文件已经结束,从而1.asp%00jpg的内容写入到1.asp中,从而达到攻击的目的。%00不是针对所有基于白名单的后缀名检查都能绕过,代码的实现过程中必须存在截断上传漏洞。
7、条件竞争上传绕过
此漏洞是个逻辑漏洞,原理就相当于不能成功删除一个已经打开的文件。
演示代码:
<?php
$allowtype = array("gif","png","jpg");
$size = 10000000;
$path = "./";
$allowtype = array("gif","png","jpg");
$size = 10000000;
$path = "./";
$filename = $_FILES['file']['name'];
if(is_uploaded_file($_FILES['file']['tmp_name'])){
if(!move_uploaded_file($_FILES[''file][''tmp_name],$path.$filename)){
die(""error:can not move);
}
}else{
die("error:not an upload file!");
}
$newfile = $path.$filename;
echo "file upload success";
if($_FILES['file']['error']>0){
unlink($newfile);
die(""Upload file error: );
}
$ext = array_pop(explode(".",$_FILES['file']['name']));
if(!in_array($ext,$allowtype)){
unlink($newfile);
die('error');
}
?>
这段代码功能首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉。利用思路首先上传一个php后门文件,同时当然这个文件会被立马删掉,但我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就不会被删除。
八、编辑器漏洞
(这没法链接pdf,手册地址“https://navisec.it/编辑器漏洞手册”,需要可私聊)
九、WAF文件上传绕过
(1)垃圾数据填充
考虑到攻防收益,有些主机waf为不影响服务器性能,会对校验的用户数据设置一个上限。如果此时我们构建一个较大的文件,将前面上限数据都为垃圾数据,攻击payload放在后面,那么便可以绕过waf对文件内容的校验。
Content-Type类型数据后添加垃圾数据
上传文件头部添加——绕过对文件名的校验
Content-Disposition:后添加垃圾数据
(2)filename绕过
此方法可以针对早期的安全狗,主要是因为waf解析和协议解析两者不匹配同步的问题。协议会将最后的filename值作为文件名,而waf可能会将第一次解析到的filename作为文件名进行检查。所以当filename1为一个正常的文件名,filename2为可执行解析的文件名,waf并不会检测出问题。
(3)POST与GET方法绕过
有些waf对于文件上传单纯检测以post方法上传的数据包内容,若将post型数据包改为Get,则可以实现绕过。
(4)exee扩展名绕过
上传.exe文件通常会被waf拦截,如果使用各种特性无用的话,那么可以把扩展名改为.exee再进行上传。
(5)单双引号互换绕过
总之waf的绕过方法总的来说可以总结为:
数据溢出
符号变异
数据截断
重复数据
四大类,当然各种奇淫巧技的姿势很多,还得不断总结。