首先,上传的文件路径必须的清楚的,文件可被访问并且能执行。
文件上传验证的种类
1.客户端js验证
通常我们看见网页上会有一段js脚本,用它来验证上传文件的后缀名,其中分为黑白名单的形式,一般情况下只验证后缀名。
判断:当你在浏览器中浏览加载文件,但没有点击上传按钮时就会弹出对话框,比如:只允许上传.jpg/.jpeg/.png后缀名的文件,可此时并没有发送数据包。
2.服务器端验证
*文件头content-type字段校验(image/gif)
前面情况同上(客户端js验证),可用burpsuite抓包改包,即将content-type字段改为image/gif。
*文件内容头校验(gif89a)
几个常见的文件头对应关系:
(1) .JPEG;.JPE;.JPG,”JPGGraphic File”
(2) .gif,”GIF 89A”
(3) .zip,”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
*文件后缀名绕过
黑名单验证:
(1)大小写绕过,如pHp,aSp等。
(2)可能被解析的文件扩展名,如jsp:jspx,jspf ;asp:asa,cer,aspx ;php:php2 php3 php4 ;exe:exee。
白名单验证:
(1)0x00截断绕过
(2)解析调用/漏洞绕过
3. 配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马。
绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)
(1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
(2)然后再上传一个.php的文件,内容为<?php Include(“上传的txt文件路径”);?>
此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:
#PHP
<?php Include("上传的txt文件路径");?>
#ASP
<!--#include file="上传的txt文件路径" -->
#JSP
<jsp:inclde page="上传的txt文件路径"/>
or
<%@include file="上传的txt文件路径"%>
详细参考:文件包含漏洞(绕过姿势)
4. 配合服务器解析漏洞绕过
详细可参考:http://thief.one/2016/09/21/服务器解析漏洞/
5. 配合操作系统文件命令规则
6. CMS、编辑器漏洞
7. 配合其他规则
8. WAF绕过