关于WAF的一些总结笔记


一、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

使用python wafw00f.py -h可以查看工具的使用详情

  • Sqlmap

Sqlmap是一款检测和利用SQLi漏洞工具,也是基于python编写,业内认同率较高,sqlmap用来探测waf类型相比较wafw00f来说还多一些。
Sqlmap用来探测每种waf设备都是一个python文件,同样是从cookie信息或者返回头信息进行判断。
使用命令如下:python sqlmap.py -u "http://xxxx.com" --identify-waf --batch

  • xenoitx

检测和利用xss漏洞的神器,waf检测也是其中的功能之一。

  • Nmap

使用命令nmap -p 80 --script http-waf-detect.nse www.xxx.com

四、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就是一一句话,想别人之所想。人写的规则难免会有遗漏,去考虑安全工程师会有那些遗漏,往往很有效。