Web应用防火墙规则开发与绕过测试实战

本项目详细演示了如何在Apache上构建和测试ModSecurity WAF规则,包括SQL注入检测、规则绕过技术、日志分析和规则强化,涵盖完整的Web应用安全防护实践流程。

🔒 项目2 — WAF规则开发与绕过测试

项目: Web应用安全 — 项目2
摘要: 本仓库演示了在Apache上构建和测试ModSecurity WAF规则,以检测和阻止针对故意存在漏洞的PHP应用程序的SQL注入(SQLi)及相关绕过尝试。

⚠️ 重要提示: 本仓库中的所有测试和工具仅用于实验室环境。请勿对您不拥有或未获得明确测试权限的系统运行攻击或扫描。


仓库结构

1
2
3
4
.
├── modsecurity-custom.conf      # 自定义ModSecurity规则(示例)
├── login.php                    # 存在漏洞的PHP测试应用程序
├── Project_2_WAF_Report.docx    # 详细项目报告(截图和结果)

内容与目标

本项目演示:

  • 在Apache上安装和配置ModSecurity
  • 创建针对性的ModSecurity规则(示例:检测UNION SELECT SQLi)
  • 执行基线绕过测试(混淆、URL编码、注释)
  • 启用和分析ModSecurity审计日志
  • 迭代和强化规则以减少误报并防御绕过

先决条件

测试环境选项(选择其一):

  • Linux虚拟机(Ubuntu / Kali)— 推荐(隔离实验室)
  • Kali Linux — 有用,因为它包含许多测试工具
  • WSL2与Ubuntu — 可能,但网络差异可能适用

最低软件要求:

  • Apache HTTP服务器(apache2
  • ModSecurity(libapache2-mod-security2
  • PHP(phplibapache2-mod-php
  • curl(用于测试请求)
  • 可选:Burp Suite / OWASP ZAP,sqlmap(用于绕过测试)

快速安装(Ubuntu / Kali)

在终端中运行以下命令:

1
2
3
4
5
6
# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装所需软件包
sudo apt install -y apache2 libapache2-mod-security2 php libapache2-mod-php \
    curl nano vim unzip git build-essential net-tools

启用ModSecurity并重启Apache:

1
2
3
4
sudo a2enmod security2
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
sudo systemctl restart apache2

部署存在漏洞的应用程序

将测试应用程序放置在Apache Web根目录中:

1
2
3
# 从仓库根目录(login.php所在位置)
sudo cp login.php /var/www/html/
sudo chown www-data:www-data /var/www/html/login.php

打开浏览器并访问:

  • http://localhost/login.php(如果在本地工作)
  • http:///login.php(如果使用具有桥接网络的虚拟机)

添加自定义WAF规则

将包含的规则文件复制到Apache配置并启用它:

1
2
3
sudo cp modsecurity-custom.conf /etc/apache2/conf-available/
sudo a2enconf modsecurity-custom
sudo systemctl reload apache2

示例规则(包含在modsecurity-custom.conf中):

1
2
3

  SecRule ARGS_POST "@rx (?i)union\s+select" \
    "id:10001,phase:2,block,msg:'SQL Injection Attempt Detected (UNION SELECT)'"

为演示目的,此规则故意保持简单。有关改进规则,请参阅下面的“强化”部分。


基线测试

  1. 访问登录页面并提交良性用户名(例如,admin)— 预期:HTTP 200,应用程序回显输入。
  2. 在用户名字段中提交基本SQLi有效负载:
    1
    
    test' UNION SELECT 1,2,3--
    
    预期:403 Forbidden(被规则阻止)并在ModSecurity日志中记录条目。

您也可以使用curl进行POST:

1
curl -i -X POST -d "username=test' UNION SELECT 1,2,3--&password=pass" http://localhost/login.php

绕过测试(示例)

尝试以下变体(仅限实验室)以测试绕过:

  • 混合大小写:test' UnIoN SeLeCt 1,2,3--
  • 注释混淆:test' UNI/**/ON SELECT 1,2,3--
  • URL编码:test'%20UNION%20SELECT%201,2,3--
  • 双重编码/空字节:union%2500select

使用curl循环自动化测试(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
payloads=(
"test' UNION SELECT 1,2,3--"
"test' UNI/**/ON SELECT 1,2,3--"
"test' UnIoN SeLeCt 1,2,3--"
)

for p in "${payloads[@]}"; do
  code=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "username=${p}&password=pass" http://localhost/login.php)
  echo "\"${p}\", $code"
done

将结果记录到evasion_results.csv以供报告使用。


日志记录与分析

/etc/modsecurity/modsecurity.conf中启用审计日志记录:

1
2
3
4
SecAuditEngine On
SecAuditLogParts ABDEFHIJZ
SecAuditLogType Serial
SecAuditLog /var/log/apache2/modsec_audit.log

确保文件存在且权限允许root/adm写入:

1
2
3
sudo touch /var/log/apache2/modsec_audit.log
sudo chown root:adm /var/log/apache2/modsec_audit.log
sudo chmod 640 /var/log/apache2/modsec_audit.log

在测试时跟踪日志:

1
sudo tail -f /var/log/apache2/error.log /var/log/apache2/modsec_audit.log

审计条目包括原始请求、匹配的变量、规则ID和转换信息。


强化规则(推荐)

使用转换和链式规则来防御绕过并减少误报:

1
2
SecRule ARGS_POST "@rx union\s+select" \
  "id:10011,phase:2,deny,log,auditlog,msg:'SQLi Attempt (UNION SELECT)',t:urlDecodeUni,t:lowercase,t:compressWhitespace,t:htmlEntityDecode"

链式规则示例:

1
2
SecRule ARGS "@rx (?i)union" "id:10100,phase:2,pass,log,chain"
SecRule ARGS "@rx (?i)select" "t:lowercase,deny,msg:'Chained SQLi detection'"

还考虑首先在仅检测模式下启用OWASP CRS(核心规则集),进行调整,然后启用阻止。


故障排除

  • 无DNS / apt失败: 检查网络,ping 8.8.8.8。如果DNS损坏,将nameserver 8.8.8.8添加到/etc/resolv.conf或配置systemd-resolved
  • ModSecurity未加载: sudo apache2ctl -M | grep security2 — 如果不存在,运行sudo a2enmod security2并重启。
  • 审计日志缺失: 确认/etc/modsecurity/modsecurity.conf包含SecAuditLog /var/log/apache2/modsec_audit.log并且日志文件存在。
  • 规则未触发: 确认您的自定义配置已启用(ls /etc/apache2/conf-enabled/),并检查sudo apache2ctl configtest/var/log/apache2/error.log

交付物(仓库中应包含的内容)

  • modsecurity-custom.conf — 带有注释和规则ID的最终/强化规则
  • login.php — 用于测试的存在漏洞的应用程序
  • Project_2_WAF_Report.docx — 完整报告(截图、日志、EV结果)
  • evasion_results.csv — 测试有效负载和结果(推荐)

贡献与说明

  • 本仓库是一个培训/实验室资源。如果您改进了规则或添加了自动化测试,请打开一个包含详细信息和证据(日志、测试结果)的PR。
  • 在部署到生产环境之前,始终在隔离环境中测试规则。

许可证

用于教育目的的使用和分发。您可以在此处添加您偏好的许可证(例如,MIT)。


参考

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计