文件上传漏洞过程javascript
用户上传了一个可执行的脚本文件,并经过此脚本文件得到了执行服务器端命令的能力。php
通常的状况有:html
上传漏洞须要具有如下几个条件:
java
常见,绕过文件上传检查功能web
常见的文件上传检查针对文件类型进行,攻击者可使用手动修改POST包而后添加%00字节用于截断某些函数对文件名的判断。如xxx.php[\0].JPG,对于一个只容许上传JPG格式的服务器,此文件能够绕过文件上传检查,可是对于服务器端解释来讲,函数会被[\0]截断,致使成为xxx.php代码。除了修改文件名来绕过类型检查外,还能够修改文件头来伪造文件头,欺骗文件上传检查。sql
如何安全上传文件shell
各类形式的文件上传漏洞总结apache
1.在很早之前,不少上传文件过滤是用的是javascript,因此改一下javascript或直接nc发包就好了。有的是判断后缀,有的只是判断id,好比:浏览器
“uploadfile” style=”file” size=”uploadfile” runat= “lbtnUpload” runat= “JavaScript”>
只是简单的对ID进行验证,只要构造javascript:lbtnUpload.click();知足条件达到上传木马的效果。成功之后查看源代码缓存
a “lbtnUpload” “javascript:__doPostBack(‘lbtnUpload’,”)”script ‘javascript’
2.IIS6的目录解析问题如/a.aspx/a.jpg,在某些特殊状况下会应用到,在很早的时候由我同事1982发现的。
3.某些上传文件的被动过滤有缺陷,有的只过滤asp,却忘了.asa、.cdx、cer等等,php的话就尝试php二、.php三、.php4 等等,相关实例有动力文章(Powereasy),具体参考http://www.sebug.net/vulndb/4326/
4.结束符%00截断最后的后缀,最先是老外发现,当时很是流行,主流bbs程序都有此漏洞,好比dvbbs就存在此漏洞,很是经典!
5.iis的文件名解析漏洞,好比a.asp;.gif,分号自己以及后面的都会被系统忽略,国人kevin1986发现的,很是经典!
6.apache文件名解析漏洞,好比a.php.gif或a.php.aaa,最先看到国内的superhei先提出的。不过在新版 apache/php给补了。
7.二次上传漏洞,最新的上传漏洞方法,主要是利用逻辑漏洞,好比无惧无组件上传代码:
view sourceprint?1 fileExt=lcase(Mid(ofile.filename,InStrRev(ofile.filename,".")+1)) arrUpFileType=split(UpFileType,"|")'得到容许上传的全部文件扩展名 for i=0 to ubound(arrUpFileType)'判断上传的文件扩展名是否在容许的范围内 if fileEXT=trim(arrUpFileType(i)) then EnableUpload=true exit for end if
这里的EnableUpload只验证了一次就变为了true,第一次上传合法文件使其变为true,第二次再上传webshell,利用这个漏洞须要上传组件支持一次多文件上传。
有此类逻辑漏洞的不在少数,好比fckeditor最新版中,因为Fckeditor对第一次上传123.asp;123.jpg 这样的格式作了过滤。也就是IIS6解析漏洞。
上传第一次,被过滤为 123_asp;123.jpg 从而没法运行。可是第2次上传同名文件123.asp;123.jpg后。由 于”123_asp;123.jpg”已经存在。
文件名被命名为123.asp;123(1).jpg 123.asp;123(2).jpg这样的编号方式。其余的还有fckeditor 2.4 提交1.php再提交1.php+空格,详见http://superhei.blogbus.com/logs/4603932.html 《又见fckeditor》superhei一文。
8.关键字一次性替换,好比有的后台增长.asa上传类型asa被过滤替换为空字符,但用.asasaa被过滤其中的asa剩下.asa就绕过了, 好比还有科讯Kesion CMS,漏洞在http://localhost/User/UpFileSave.asp?user_upfile.asp,文件名最后保证 是.asachr0.jpg或者.cerchr0.jpg就好了。
9.上传程序存在sql注入。好比fckeditor 2.1.6就能够经过sql注入增长一个.asp上传类型。还有PunBB pun_attachment上传附件扩展sql注射漏洞,详见http://sebug.net/vulndb/12538/。
10.小数点或空格被忽视,这个也是利用了win系统特性了,好比a.asp.和a.asp空格、a.php.
11.超长文件名截断文件后缀,各系统版本的超长文件名长度可能各不相同,最多见的是应用在本地包含漏洞方面,因为php新版过滤了%00,因此用 a.php?files=../../../../../../../../../etc/passwd…………………………………(N个 点).html,推荐用.和/或空格来试。在win下:
echo aaaa>a.asp若干个空格.gif dir a.asp 2010-03-15 17:41 2,852 a.asp
12.只校验了文件头和文件完整性
有的上传程序校验文件头,并只容许上传图片文件类型且验证图片文件完整性(仅伪造文件头仍是不行),但没有验证文件后缀,也没有强制更改上传文件的 后缀。咱们能够新建一个几kb大小之内的jpg图片文件(颜色填充),而后用ue以十六进制打开文件,在文件内容末尾加些空格后再加上一句话木马< ?fputs(fopen("c.php","w"),"“)?>存为 aaa.php上传。若是有验证文件后缀,也能够结合以上方法绕过文件的后缀验证。