常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

admin 2025年1月13日10:40:56评论17 views字数 5982阅读19分56秒阅读模式
常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

本篇文章通过 网络架构层、HTTP协议层、第三方应用层讲解了绕过WAF的常见方法

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)
常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)
常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

一、网络架构层

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

一般通过域名指向云WAF地址后反向实现代理,找到这些公司的服务器的真实IP即可实现绕过

具体方法如下:

1、查找相关的二级域名及同一域名注册者的其他域名解析记录。

2、通过查看邮件MX解析记录来发现真实服务器的IP记录或网段,例如:

windows可以执行命令:

nslookup -qt=mx baidu.com

Linux可以执行如下命令来查看baidu.com域名的MX解析IP地址

dig mx baidu.com

3、查看域名的历史解析记录。实现该操作的网站:

https://securitytrails.com/

4、使用zmap等快速扫描工具对全网IP进行扫描以找到网站真实IP。

5、利用SSRF漏洞反向连接的IP获取网站真实IP。

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

二、HTTP协议层

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

可以利用WAF、web serverweb语言解析引警这三方对标准HTTP解析的差异来实现绕过

具体绕过的方法如下:

1、利用某些硬件WAF对SSL加密算法的支持不够进行绕过。

参考文章:

通过滥用SSL/TLS绕过Web应用程序防火墙

https://blog.pwn.al/waf/bypass/ssl/2018/07/02/web-application-firewall-bypass.html

对应的测试脚本:

abuse-ss-bypass-waf

https://link.csdn.net/?target=https%3A%2F%2Fgithub.com%2FLandGrey%2Fabuse-ssl-bypass-waf

2、利用HTTP协议版本来进行绕过

HTTP发展至今,已由1991年的0.9版发展到2015年的2.0版,由于不支持相关协议的WAF在解析数据包时会出问题,因此通过发送不同版本协议的粘包即可绕过某些WAF。

3、利用URL编码、charset编码、MIME编码等进行绕过。

ISASP支持类似Unicode%u0027的编码,还会对不合法的URL编码进行字符删除。IISASP对s%elect 编码的处理结果为select,而

Nginx的ngx_unescape_uri函数对它的解码结果为slect。Nginx的ngx unescape_uri函数在处理%编码时,如果%后面的第一个字符不在十六进制范围内,则会丢弃%;否则判断第二个字符是否在十六进制范围内,如果不在则会丢弃%和 第一个字符。

HTTP请求头Content-Type的charset编码可以指定内容编码,这个值一般都是UTF-8编码的,但恶意攻击者可以指定使用ibm037、 ibm500、cp875、ibm1026等不常用的编码来进行绕过。例如,可以设置Content-Type头的值为application/x-www-form-

urlencoded;charset=ibm500或 multipart/form-data;charset=ibm500,boundary=blah等。这里使用Burpsuite的HTTP Request Smuggler插件可以简化数据包的修改操作。

在Spring中,如果上传的文件名以=?开始并以?=结束,则调用MimeDelegate.decode来对文件名解码。MIME是邮件协议中用到的编码方式,这里我们可以将上传文件名改为=2UTF-82B?YS5gc3A=?=UTF-8代表字符编码,?B?代表后面的YS50c3A=是base64编码的。经过

Sprina解码得到的文件名是aisp,而一般的WAF如果之前没有经过处理,那么就会出现在WAF中上传文件名过滤被绕过的问题。

4、利用对上传协议multipart/form-data的不规范解析进行绕过。

以PHP Web Server对multipart/form-data的解析作为例子。

由于该协议对PHP对解析存在缺陷、使得如果一行有多个filename字段值,则PHP Web Server会取最后一个filename值,如下所示:

 Content-Disposition: form-data; name="file1"; filename="a.txt";filename="a.php";

PHP Web Server最终得到的文件名是aphp,而某些WAF只判新第一个filename的值,因此WAF对上传的文件的过滤检测功能会被黑客绕过,并且这里的form-data可有可无,将其去掉也不影响PHP Web Server获取 filename .

此外,filename的编码还受HTTP请求Content-Type头中charset的影响,PHPWebServer可以根据这个值进行解码处理。这些都有可能被一些人稍微做点手脚,便可以绕过不少WAF的文件上传过滤检测功能。

5、其他协议的绕过

URI解析绕过:

有些WAF可以处理对URI不兼容的绕过,如:

GET /xxx/a.isp?x= &id=union%20a11%20select%20adversion HTTP/1.1

将HTTP原始数据包的"x="后面设置为空格,某些硬件WAF就会忽略后面的&id=union%20al1%20select%200aversion参数从而绕过 WAF。

还可以利用一些较少用到的HTTP处理来绕过,例如在HTTP请求body chunked 编码时进行注释及变形。

利用HTTPHost头也可以绕过一些基于域名防护的WAF,一般的Host头字符串中不包含端口信息,如":80"或":443”,域名也可以用本地Host来代替,可以有如下写法:

Host:localhost:80 Host:127.0.0.1:80

除此外,基于协议的绕过还有很多,如HPP复参绕过、参数名的特殊字符转换绕过等。

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

三、第三方应用层

常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

第三方应用层主要有数据库、系统命令、第三方组件等组成部分。下面对这3部分的绕过进行具体说明。

1、数据库的绕过

数据库的绕过方式极多,有注释绕过、编码绕过、不同数据库对空格的不同定义绕过等。

利用MySQL的版本号注释(/*!)功能绕过WAF的情况最多,还有一些方法也可以绕过WAF,比如,利用0xA0代替空格也能绕过一些

WAF,利用和e浮点等特殊用法绕过WAF(绕过一些如union的关键字),以及利用&&代替and等关键字和大括号注释(如union select{x 1],xx)绕过WAF等。

在MySQL中,从0x01至0x0F的字符都可以代表空格。通过注释加换行也可以绕过一些WAF过滤,比如。1%23%0AAND%23%0A1=1%23经过URL解码后是#字符,#字符是MySQL中的注释符,%0A经过URL解码后是换行符);还有利用""和"。"特殊符号进行绕过的,如:

union select xx from.table union select:top 1 from and:xx

另外,利用exec编码也可以绕过关键字,如:

and 1-0;declare @s varchar(4000) set @5=cast(0x44524f50205441424c4520544d505f44423b as varchar(4000));exec(@S);--

更多有关数据库的绕过可以参考sglmap的temper插件,插件地址为:https://aithub.com/sglmapproject/salmap/tree/master/tamper

2、系统命令的绕过

以cat /etc/passwd命令为例,在Linux bash环境下去掉空格的写法如下:

cat</etc/passwdlcat,/etc/passwd] cat$IFS/etc/passwdX=$'catx20/etc/passwd'&&sx

以ping baidu.com为例,在windows中替换空格的写法如下:

ping%CommonProgramFiles:10.-18%baidu.com ping%PROGRAMFILES:~10,-5%baidu.com 

在Linux的bash环境下想要绕过关键字,则可以插入成对的单引号、双引号或反引号,其中反引号必须连着写,比如可以将cat/etc/passwd 写为以下形式:

c'a't /etc/pass'"wd c""at /e't'c/pass""wd c""at /e't'c/pas~~s*wd 

另外,也可以在shell命令的任意位置插入$,或者在单词结尾处插入$x,这里的x可以是任意字母,例如可以写成如下形式:

另外,也可以在shell命令的任意位置插入$@,或者在单词结尾处插入$x,这里的x可以是任意字母,例如可以写成如下形式

c$@at /e$@tc/pass@swd cat$x /etc$x/passwdsx cas@t /etc$x/passwd$x 

若通过编码绕过关键字,则可以将cat/etc/passwd进行base64编码,写法如下:

echo Y2F0IC91dGMvcGFzc3dklbase64 -dlsh

若通过通配符绕过关键字,则linuxbash的通配符与windows的类似,支持使用?代表单个字符和使用*代表多个字符的写法.如/bin/cat/etc/passwd 命令可以有以下写法:

/b??/ca? /e?c/pas?wd/b*/ca* /et*/pas*d /b??/can /e?c/pas*d

除此之外,还可以通过一些脚本执行引擎,如perl、python、nodejs、php、java等来绕过WAF关键字,相关写法如下:

perl -e 'sa "ca" Sb="t /et".sc="c/pas".exec sa.sb.sou"swd"."python -c 'import subprocess;subprocess.call(["ca"+"t","/et"+"c/pa"+"sswd"1);"3 php -r 'exec("ca"."t /et"."c/pa"."sswd");"

3、第三方组件的绕过

一般来说,WAF会用到的第三方组件有PCRE、ISAPI、Libinjection等。

PCRE在处理正则表达式时,为了防止ReDoS正则表达式拒绝服务攻击,提供了PCRE EXTRA MATCH LIMIT 和

PCRE EXTRA MATCH LIMIT RECURSION选项来限制匹配次数。PCRE EXTRA MATCH LIMIT 的值默认为100万, PCRE EXTRA MATCH LIMIT 可以限制匹配的总次数;而PCRE EXTRA MATCH LIMIT RECURSION主要限制匹配递归次数,并不是所有匹配都存在递归,所以该值在小于 PCRE EXTRA MATCH LIMIT 值时才有意义

有些WAF为了防止ReDoS都会将PCRE EXTRA MATCH LIMIT 设置为比默认值更小的值,加入将WAF过滤SQL语句的正则表达式写成:

/UNION.+?SELECT/is

而此时PCRE EXTRA MATCH LIMIT的值为100万,那么要绕过WAF过滤防护的SQL语句可以写成:

union/*aaa..*/select

这里被注释掉的字符a有100万个,很容易满足PCRE EXTRA MATCHLIMIT的值为100万的限制条件,而且这些字符的数据量大小不到1MB,不会占用太多空间。根据此方法可以绕过很多类似的WAF正则规则。

SAPI是IIS提供的一套编写API的插件,ISAPI filter可以对请求头中的数据进行过滤,ISAPIextension可以获取请求的body数据,对应的原型为HttpExtensionProc(EXTENSION CONTROL BLOCK*pECB)。这里可以通过pECB->lpbData获取到post请求的body部分的数据,但最大只能存储48kb的数据。总的大小可以通过pECB->cbTotalBytes获取,超过48kb的数据的同步函数调用方式可以通过pECB->ReadClient(...)获取,异步函数调用方式可以通过pECB->ServerSupportFunction(...,HSE REO ASYNC READ CLIENT....)获取。

但是,这样在SAP插件的WAF中读取超过48kb的数据会导致后面的ASP获取不了多干48kb的数据,因此很多基干ISAPI的IIS WAF都可以通过把攻击数据放到48kb外而绕过WAF防护。如果某post参数id存在SQL注入,那么我们可以填充48kb的无用数据后再写注入语句,如下所示:

x=aaa...a&id=1%20union%20a11%20select%201,1,1,1@dversion,1

其中,上面的a字符所占用的空间超过了48kb

ibiniection被应用于很多WAF中,知名的有modsecurity。因为Libiniection只是对SQL语句进行标签化(token化),然后对被标签化的字

符串进行匹配,所以同一种绕过方法通常可以绕过很多SQL注入语句的过滤规则。

利用不常用的SQL函数可以绕过Libinjection过滤,比如用mod(3.2)代替1的SQL语句可以写为:

mod(3,2) union select mod(3,2),usr,pwd from user --

通过使用Fuzz测试技术也可以绕过Libinjection过滤,例如插入1<@到SQL语句中可以绕过Libinjection防护,此方法也可以绕过某些WAF的SQL注入语义检测引擎。相关的Python脚本地址为:https//wafninja/libinjection-fuzz-to-bypass/

通过大括号也可以绕过Libinjection过滤,MySQL支持(identifier expr)这种兼容ODBC的转义写法,对应的可绕过Libinjection过滤的 SQL语句如下所示:

1'<@=1 or {x (select 1)} --1 and{`if`updatexml (1,concat (0x3a,(select /*!50000(/*!50000schema_name) from/*!50000information_schema*/.schemata limit 0,1)),1)} -- 

四、总结

总的来说,在WAF上只要善于挖掘,总能找出各式各样的绕过方法。

作者:随亦

文章引用:https://blog.csdn.net/wutianxu123/article/details/104260945

原文始发于微信公众号(LemonSec):常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月13日10:40:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   常见的WAF绕过方法 (从网络架构层、HTTP协议层、第三方应用层分析)https://cn-sec.com/archives/1107180.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息