文件上传绕过姿势补充
绕过姿势
客户端绕过(抓包改包)
• 服务端绕过 • 文件类型
• 文件头 • 文件后缀名
• 配合文件包含漏洞绕过
• 配合服务器解析漏洞绕过
• CMS、编辑器漏洞绕过
• 配合操作系统文件命名规则绕过
这里只针对自己不太熟悉和使用的一些姿势进行解释。
1. 通过服务器解析
针对早期版本安全狗,可以多加一个filename
或者将filename换位置,在IIS6.0 下如果我们将filename放在如下位置
2.配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马。
绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)
(1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容; (2)然后再上传一个.php的文件,内容为 此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:
3.00截断
0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
test.php(0x00).jpg
test.php%00.jpg
路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
4.POST/GET
有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。
此种情况可以上传一个POST型的数据包,抓包将POST改为GET。
5利用NTFS ADS特性
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。
6.利用waf本身缺陷
6.1 删除实体里面的Content-Type字段
第一种是删除整行。第二种是删除C后面的字符,删除掉ontent-Type: image/jpeg只留下c,这时将.php加到c的后面即可,注意后面加上双引号
如
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"
6.2>删除Content-Disposition字段里的空格
增加一个空格导致安全狗被绕过案列: Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099
尝试在boundary后面加个空格或者其他可被正常处理的字符: boundar= ———————-47146314211411730218525550
6.3 修改Content-Disposition字段值的大小写
6.4 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 -----------------------------4714631421141173021852555099--
6.5文件名处回车
6.6 多个Content-Disposition
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,Win2k8 + IIS7.0 + PHP
7.特殊姿势
文件重命名绕过:
如果web程序会将filename除了扩展名的那段重命名的话,还可以构造更大的点,符号等等.
特殊的长文件名绕过:
文件名使用非字母数字,比如中文等最大程度的拉长,也可结合其他特性进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
反删除:
将下图file1改成了file4,这样就不会把这个文件删除了。(JCMS漏洞
关于WAF的绕过其实还可能有:
1、在Content-Disposition和Content-Type中间插个空行或随意垃圾数据
2、HTTP头部中,Content-Type之后到分隔符之前任意空行
3、Content-Disposition:后插入换行形成 Content-Disposition: \n form-data;xxxx
4、filename="xxx.php 这里前面有引号,后面没有引号等
5.在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。