文件上传检测
分类
文件上传漏洞类型
任意上传概念
服务端脚本语言未对上传的文件进行任何限制和过滤,导致恶意用户上传任意文件。
前端JS检测
js源代码:
function checkFileExt()
{
var filename = document.getElementById("file0").value;
var flag=false; //设置标志位
var arr = ["jpg","png","gif"];
var index = filename.lastIndexOf("."); //取出上传文件的扩展名
var ext = filename.substr(index+1);
for(var i=0;i<arr.length;i++) //循环比较
{ if(ext == arr[i]) {flag = true;
//一旦找到合适的,立即退出循环
break;} }
if(flag) {
alert("文件名合法");
}else{
alert("文件名不合法"); }
return flag;
};
绕过js校验上传
Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。
绕过方法
删除或者禁用js
使用代理上传文件,比如Burp Suite
文件上传漏洞-后端上传代码校验绕过
前面介绍的两种文件上传漏洞都比较简单,大多数网站都能很好的避免此类问题。但是仍然有比较多的网站存在后端代码校验绕过的问题。此类文件上传漏洞较为复杂,一般根据绕过Web应用校验的方法可以分成下面几种。
常规检测方法
MIME文件类型校验
扩展名验证
文件头校验
文件扩展名检测
截断上传
基于一个组合逻辑漏洞造成的。在某些时候,攻击者手动修改了上传过程中的POST包,在文件名后添加一个%00字节额,则可以截断某些函数对文件名的判断。因为在许多语言的函数中,比如在C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符。受此影响的环境有Web应用和一些服务器。比如应用原本只允许上传JPG图片,那么可以构造文件名为xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断;但对于服务器来说,此文件因为0x00字符截断的关系,最终却变成了xxx.php。
检测方法
黑名单
黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。
白名单
白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常文件。
绕过黑名单
绕过方法:
(1)解析漏洞
(2)截断上传
(3)可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
(4)找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类
jsp jspx jspf
asp asa cer aspx
php php php3 php4 php5
exe exee
(5)利用Windows的命名机制:shell.php. shell.php空格 shell.php:1.jpg shell.php:: $DATA
如何绕过白名单
解析漏洞
截断上传
文件包含