文件上传漏洞WAF绕过方法

今天继续给大家介绍渗透测试相关知识,本文主要是文件上传漏洞WAF绕过方法。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、文件上传数据包解析

一个常见的文件上传的数据包如下所示:
在这里插入图片描述
从以上数据包内容可以知道,和文件上传有关的内容大概有四项,分别是Content-DispositionnamefilenameContent-Type。Content-Disposition主要用于文件下载,在文件上传的数据包中专用不大,因此我们可以几乎随意的更改该字段;name是表单的名称,该字段的内容由浏览器段表单的form名称所决定,并在传输到目标服务器后进行匹配,因此我们不能修改该选项;filename是上传的文件名,我们在文件上传时一般会修改该选项,使其绕过各种检测,并最终在服务器后台呈现出可解析为PHP或ASP等代码的后缀名;Content-Type标识了上传的文件的类型,我们在进行文件上传时有些检测上传文件的防护软件或者脚本代码会检测该字段,因此我们通常会进行修改。

二、文件上传WAF防御逻辑

当前,WAF对于文件上传漏洞的防御,主要是基于文件名,少部分是基于文件内容,有些基于主机的WAF,还会进行文件目录权限的设置。基于文件内容的检测,我们很容易通过各种免杀、超大文件等方式进行突破,因此,我们主要是讲解针对文件名过滤的WAF绕过突破思路。
通常来讲,WAF对文件名的解析有以下三步:
1、获取HTTP Request数据包包头里Content-Type中的boundary值。
2、根据获取到的boundary值,解析数据包,获取上传文件的文件名。
3、根据获取到的文件名,来进行黑名单或者是白名单的匹配。

三、文件上传常见绕过方式

通常来讲,文件上传常见绕过方式主要有以下7点:
1、垃圾数据填充
垃圾数据填充会经常运用在各种方式的WAF绕过中,是一种很常见的手段,WAF在设置的时候为了防止自身占用太多资源,以至于干扰了正常服务的提供,因此每次收到超长超大的数据包时,会放弃检测,或者是只检测部分内容,这样我们如果构造这样的畸形数据包,就可以把payload语句放在数据包的尾部,即可绕过WAF的检测。
针对文件上传漏洞,我们当然也可以构造这样的数据包,但是我们还有其他的垃圾数据填充方式。最常见的是name和filename参数之间添加垃圾数据,并且在这些垃圾数据的后面用分号间隔。
此外,我们还可以构造超长的boundary字符串,当boundary字符串非常长(boundary字符串的长度本身没有规定限制)时,恰好达到WAF不能处理,但是Web服务器能够处理的长度,就可以绕过WAF的检测。此外,在boundary字段的末尾或者前面,也可以用逗号分割,插入大量垃圾数据。
2、引号变换
在正常情况下,Content-Disposition后面的内容没有用引号包裹,而name和filename的内容则会用引号包裹。我们在进行文件上传绕过WAF时,可以在这些字段的引号上做文章,比如将原来有引号的替换为没有引号,没有引号的加上引号,原来是双引号的改成单引号,甚至是反引号,构造不闭合的引号,或者添加多余的引号等等。
3、数据截断
在Content-Name、name和filename字段中,我们可以添加一些特殊字符,来尝试是否可以绕过WAF。
常见的截断方式有四种,分别是换行符截断分号截断引号截断以及**%00截断**。这些截断方式,都是构造畸形数据包,干扰WAF对数据包中文件名称的提取,同时又不影响Web服务器对文件名称的提取,以此来绕过WAF。
4、数据重复
我们可以尝试构造畸形数据包,该数据包内含有多个filename,这样由于WAF和服务器内部对filename解析逻辑的不同,有可能WAF解析到了合法的文件名,而服务器内部逻辑采用的是非法的文件名。
除此之外,我们还可以构造多个含boundary字段的上传区段,或者在一个区段内含有多个boundary头。
5、字段名变换
针对Content-Disposition、name和filename这三个参数,我们也可以进行特殊设置,用于绕过WAF。
首先是对这三个字段进行大小写进行变换,比如将name换成Name、Content-Disposition换成content-disposition等等。
此外,Content-Dispositon的值也可以进行修改,因为该字段的值对文件上传在功能上影响不大,但是某些WAF却会检测Content-Disposition字段的值以判断该数据包是否是文件上传的数据包,Content-Dispositon字段的值可以变成空值或者是任意值。
最后,HTTP头部中Content-Type字段也可以进行特殊修改。常见的修改方式有如下种:
(1)将Content-Type字段的内容进行大小写变换
(2)Content-Type的内容和boundary字段之间用空格间隔,或者是在中间插入任意数据。
(3)Content-Type的内容和boundary字段之间用逗号分割,也可以向中间插入任意数据。
(4)在boundary字段之前插入数据。
(5)在boundary字段内容的末尾,加上分号或者逗号,然后再插入任意数据。
6、分号、等号变换
在Content-Disposition、name和filename这三个参数中,我们可以尝试写多个分号,或者是多个等号,然后尝试是否可以绕过WAF。
7、顺序颠倒
针对name和filename这两个字段,我们可以尝试交换name和filename的顺序。(由于有规定Content-Dispositon必须在前面,因此我们不能修改该字段的内容)
此外,我们也可以交换Content-Dispositon整体和Content-Type的顺序。注意,在这里的Content-Type不是HTTP头部的Content-Type字段,而是Content-Disposition下面一行的Content-Type。
此外,我们还可以交换boundary的顺序,这样也不会影响文件正常上传。

四、写在最后

1、关于为什么上述手段能够绕过WAF
关于上述手段,有些人会问为什么这些看上去只是对一些引号、等号、垃圾数据等的操作会绕过WAF,这些手段表面上看上去并没有合理的解释,但是其根本原理都是利用了WAF对文件上传数据包检测的漏洞。HTTP协议对各种数据包进行了详细的规定,但是对于上述特殊的、畸形的数据包则有些没有规定如何处理。因此,基于此,我们就可以构造这种特殊的、畸形的数据包,干扰WAF对数据包的检测,让其提取不到文件名称或者认为这是一个非文件上传的数据包,以此来绕过WAF。
2、关于文件上传绕过WAF的手段
绕过WAF的方式有很多,以上介绍的也只是我个人的研究结合他人资料整理而成,有的绕过方式可能没有涉及到,因此仅做参考。
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

猜你喜欢

转载自blog.csdn.net/weixin_40228200/article/details/127200643