当前位置 : 主页 > 编程语言 > 其它开发 >

常见WAF绕过方法

来源:互联网 收集:自由互联 发布时间:2022-05-30
一、网络架构层进行绕过1. 利用真实IP地址绕过 1.查找相关的二级域名或者同一域名注册者的其他域名解析记录 2. 通过查看邮件交换记录解析来找到真实IP地址。 Windows下可以通过nsloo
一、网络架构层进行绕过 1. 利用真实IP地址绕过

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

  2. 通过查看邮件交换记录解析来找到真实IP地址。

Windows下可以通过nslookup命令
nslookup -qt=mx baidu.com
Linux下可以通过dig命令
dig mx baidu.com

  3. 查看域名的历史解析记录:https://securitytrails.com/

二、HTTP协议层绕过WAF 0.1. 利用pipeline绕过waf

  pipeline绕过是利用http协议的管道化技术,http遵循请求响应模型,比如发送一个A请求,则会返回A请求的响应,如果当发送一个请求的同时发送多个http请求,如果waf只对第一个请求进行检查判断,就可以绕过后面http请求的数据检查。

利用这种方法需要将第一个请求的connection字段值改为 keep-alive 

Connection: keep-alive
0.2. 修改http请求头的Transfer-Encoding: 字段值绕过

Transfer-Encoding: chunked 当请求头中有该字段值时,说明该报文是分块编码,post的请求体中的数据 应该分块来写。就是将数据分行来写。数据最后需要用0独占一行表示结束。

 

 

1. 某些WAF对SSL加密算法的支持不够全面进行绕过

  ssl握手有3个阶段:

   1. ClientHello和ServerHello阶段:

    首先客户端向服务端发送一条ClientHello消息,该消息中包含服务器所需的各种密码套件喝支持的SSL/TLS版本,服务端收到后,也返回一个包,包含密码套件和SSL版本。

   2. 证书交换阶段:

    连接初始化后,服务器为了向客户端证明身份,将SSL证书发送给客户端,客户端检查自己是否信任该证书并继续连接。

   3. 密钥交换阶段:

    证书交换完毕后,建立了一条安全隧道,服务器就和客户端交换密钥,该密钥用于数据的加密和解密。

  绕过方法:

   收集WAF支持的SSL密码和TLS版本,服务端支持的SSL密码和TLS版本。

sslscan

  利用这个工具可以收集服务端支持的SSL密码。

apt install sslscan 
sslscan http://target/ | grep Accept

   通过收集到的信息,找出web服务器支持的SSL密码和TLS版本,但WAF不支持。之后就可以利用。

curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test
2. 利用HTTP协议版本绕过

  通过修改HTTP协议的版本号绕过。

3. 利用url编码、charset编码、MIME编码绕过   对特殊字符进行编码

  IISASP支持Unicode编码,还会对不合法的url编码进行字符删除,比如:我们可以利用s%elect来绕过对select的过滤。

  但是nginx会将s%elect处理为slect,Nginx的ngx unescape_uri函数在处理%编码时,如果%后面的第一个字符不在十六进制范围内,则会丢弃%;否则判断第二个字符是否在十六进制范围内,如果不在则会丢弃%和%后的第一个字符。所以遇到nginx中间件时,我们可以在select的l前加%。se%lect

  修改http请求头的Content-Type字段的值

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

可以设置Content-Type头的值为
application/x-www-form-urlencoded;charset=ibm500

multipart/formdata;charset=ibm500,boundary=blah
这里使用Burpsuite的HTTP Request Smuggler插件可以简化数据包的修改操作。
   利用MIME编码绕过:spring框架可用。

   在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解析时,会取最后一个filename的值,而WAF验证时,取第一个值,我们可以在数据包中加一个filename的值,从而绕过waf。

Content-Disposition: form-data; name="file1"; 
filename="a.txt";filename="a.php";
5. 修改Host值绕过

  一些基于域名防护的WAF,我们可以修改Host值来绕过。

Host:localhost:80 
Host:127.0.0.1:80
三、第三方应用层绕过 1. 数据库绕过:

  1. mysql的版本号注释绕过:/%!

  2. 利用0xA0代替空格绕过、MySQL中0x01至0x0F的字符都能代表空格。

2. 系统命令的绕过:

  Linux系统下查看/etc/passwd

cat /etc/passwd可以改为下面方法:去掉空格
cat</etc/passwd lcat,/etc/passwd] cat$IFS/etc/passwd X=$'cat\x20/etc/passwd'&&sx
绕过关键字方法:插入成对的单引号、双引号或者反引号。
c'a't /etc/pass'"wd
c""at /e't'c/pass""wd
c""at /e't'c/pass~~*wd

  windows系统下ping 百度,替换了空格。

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

  通过一些脚本执行引擎,如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");"

 

网友评论