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绕过wafpipeline绕过是利用http协议的管道化技术,http遵循请求响应模型,比如发送一个A请求,则会返回A请求的响应,如果当发送一个请求的同时发送多个http请求,如果waf只对第一个请求进行检查判断,就可以绕过后面http请求的数据检查。
利用这种方法需要将第一个请求的connection字段值改为 keep-alive
Connection: keep-alive0.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-test2. 利用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头的值为利用MIME编码绕过:spring框架可用。
application/x-www-form-urlencoded;charset=ibm500
或
multipart/formdata;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解析时,会取最后一个filename的值,而WAF验证时,取第一个值,我们可以在数据包中加一个filename的值,从而绕过waf。
Content-Disposition: form-data; name="file1";5. 修改Host值绕过
filename="a.txt";filename="a.php";
一些基于域名防护的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");"