一、WAF介绍和原理
介绍:waf是web应用防火墙的简称,对来自web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,为web应用提供防护,也称为应用防火墙,是网络安全纵深防御体系里面重要的一环。waf属于检测型及纠正型防御控制措施。
原理:waf对请求的内容进行规则匹配,行为分析等识别出恶意行为,并执行相关动作,这些动作包括阻断、记录、告警等。
二、WAF的分类
- 软件型waf
- 硬件型waf
- 云waf
- 网站系统内置的waf
具体可以查看这篇文章【总结】浅析Waf优缺点之硬件Waf、软件Waf、云Waf
三、WAF手工与工具识别
手工判断
1 2 | 直接在相应的网站的url后面加上基础的测试语句,比如 union select 1, 2, 3%23, 并且放在一个不存在的参数名中,执行会触发waf防护,并且网站存在waf |
WAF识别工具
一些waf可以自定义返回的消息内容,或者全部返回自定义的404页面或者200页面,有一些工具会协助作为waf设备的识别。
- Wafw00f
使用
- Sqlmap
Sqlmap是一款检测和利用SQLi漏洞工具,也是基于python编写,业内认同率较高,sqlmap用来探测waf类型相比较wafw00f来说还多一些。
Sqlmap用来探测每种waf设备都是一个python文件,同样是从cookie信息或者返回头信息进行判断。
使用命令如下:
- xenoitx
检测和利用xss漏洞的神器,waf检测也是其中的功能之一。
- Nmap
使用命令
四、WAF绕过技巧
1.大小写混合
1 | uNion sElEct 1,2,3.4 |
2.url编码
1 2 3 4 5 6 7 | 极少部分的waf不会对普通字符进行url解码(union select1, 2, 3, 4, 5) union+select+1%2c2%2c3%2c4%2c5 还有种情况就是url二次解码, waf-般只进行一次解码,而如果目标web系统的代码进行了额外的ur解码,即可进行绕过 union%2bselect%2b1%252c2%252c3%252c4%252c5 |
3.替换关键词
1 2 3 | waf采用替换或者删除select/union这类敏感关键词的时候,如果只匹配一次则容易进行绕过 union select 1, 2, 3, 4转换为unionion selectect 1,2,3.4 |
4.使用注释
1 2 3 | 注释在截断sql语句中用的比较多,在绕过waf时主要使用其替代空格(/*内容*/) ,适用于检测过程中没有识别注释或替换掉了注释的waf union select 1, 2, 3, 4转换为union/*235*/select/*5588*/1,2,3,4 |
5.多参数请求拆分
1 2 3 4 5 6 7 8 9 10 | 对于多个参数拼接到同一个sq|语句中的情况,可以将注入语句分割 例如:请求url时, get参数为如下格式 a=[input1]&b= [imput2] 将get参数a和参数b拼接到sql语句中 and a=[input1] and b=[input2] 这时就可以将注入语句进行拆分 a=union/*&b=*/select 1,2,3, 最终将参数a和参数b拼接,得到的sq|语句如下 and a=union /*and b=*/select 1,2,3, |
6.http参教污染
1 2 3 4 5 6 7 8 9 | http参数污染是指同一参数出现多次,不同的中间件会解析为不同的结果.下面以IIS为例子,一般的sql注入语句如下所示 inject=union select 1, 2, 3, 4 将sq|注入语句转换为以下格式: inject=union/*&ingect=*/select/*&ingect=*/1&ingect=2&ingect= 3&ingect=4 最终在IIS中读入的参数如下所示 ingect=union/*,*/select/*,*/1,2,3,4 |
7.生僻函数
1 2 3 | 使用生辟函数替代常见函数,例如在报错注入中使用polygon () 函数替换常用函数updatexrml () 函数 SELECT polyon((select*from(select*from(select@@version)})x); |
8.寻找网站源站ip
1 2 3 4 5 6 | 对于具有云waf防护的网站而言,只要找到网站的IP地址,然后通过ip访问网站,就可以绕过云waf的检测常见的寻找网站ip的方法有以下几种 寻找网站的历史解析记录 多个不同区域ping网站,查看ip解析的结果 找网站的二级域名,ns, mx记录等对应的ip 订阅网站邮件,查看邮件发送方的ip |
9.注入参数到cookies中
1 | 某些程序员在代玛中使用$_REQUEST获取参数,而$_REQUEST会依次从get/post/cookies中获取参数,如果waf只检测了get/post而没检测cookie,可以将注入语句放入cookie中进行绕过。 |
总结:
(1)请求真实ip绕过waf: 部分waf部署架构的特性,部分waf并不是直接串在目标站点线路上,而是通过DNS解析的形式部署,此时可以先探测到目标站点的真实ip,直接请求ip以此绕过waf的检测;
(2)检测内容范围绕过: waf性能限制,检测特定内容前几k或几+K的内容,然后在此特定内容段内填充物用数据,payload放于物用数据后,以此绕过检测;
(3)协议育区绕过: waf根据自己的防御策略所支持的协议特性,针对该协议内的请求进行检查,但是存在一些协议检测或协议运行机制上的缺陷导致被绕过,例如协议未覆盖、协议解析不正确、协议解析遗漏等;
(4)检测规则绕过: waf 工程师规则编写经验、规则覆盖面等问题,来绕过检测,例如利用MySQL对些特殊字符处理的特性、语法特性绕过;
(5)文件包含绕过: 相对路径、绝对路径。
在规则绕过里,常见的就是各种编码(urlencode、 unicode、 多重编码、大小写、换行符等),填充符号(填充注释符、空格换加号、Wx00等特殊字符),比较特色的就是sqlmap的tamper脚本。缺陷绕过的话,-般有填充无用数据、特殊HTTP请求方法、耦合白名单等绕过方式。其实,绕waf就是一一句话,想别人之所想。人写的规则难免会有遗漏,去考虑安全工程师会有那些遗漏,往往很有效。