跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

怎么利用Apache mod_security构建应用级防火墙拦截SQL注入攻击教程

ModSecurity默认不生效,必须设SecRuleEngine On并加载OWASP CRS规则(含crs-setup.conf);需开启SecRequestBodyAccess、调参降误报,并验证403拦截与日志匹配。 启用规则引擎并加载基础防护 装完
libapache2-mod-security2
后,ModSecurity 默认是“不干活”状态。必须显式开启引擎,并加载规则集才能起效。 编辑
/etc/modsecurity/modsecurity.conf
,确认以下两行已设置: SecRuleEngine On —— 不是 DetectionOnly,否则只记录不拦截 Include /usr/share/modsecurity-crs/rules/*.conf —— 加载 OWASP CRS 主规则(路径依安装方式可能为
/etc/modsecurity/crs/
) 特别注意:
crs-setup.conf
必须被包含(通常在主 CRS include 前),它控制全局行为,比如是否允许编码斜杠、异常评分阈值等。漏掉这步,很多规则会“匹配但不阻断”。 针对性加固 SQL 注入检测点 CRS 默认对 URI、参数名(ARGS_NAMES)、参数值(ARGS)都做 SQLi 检测,但常见失效场景有三类,需手动补强: POST body 未解析 :确保
SecRequestBodyAccess On
已启用,否则表单提交的 SQLi payload(如
user=admin' OR 1=1--
)进不到 ARGS 变量里,规则直接跳过 大文件上传干扰 :若应用含文件上传,调大
SecRequestBodyLimit 10485760
(10MB)和
SecRequestBodyNoFilesLimit 131072
,避免 body 被截断导致规则误判 绕过手法漏检 :攻击者常用大小写混用(
UnIoN
)、URL 编码(
sel%65ct
)、注释分隔(
UNION/*a*/SELECT
)绕过。CRS v3.3+ 支持请求归一化,但需确认
SecUnicodeMapFile
和
SecUnicodeCodePage
已正确配置 调参降误报,不牺牲防护力 刚上线常因误报炸锅,比如正常搜索带单引号或 JSON 字段含 SQL 关键字。别急着关规则,优先调参: Apache 2.4.62 PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。 下载 把全局异常评分阈值从默认 5 提到 10:
SecAction "id:900120,phase:1,pass,nolog,setvar:tx.anomaly_score_threshold=10"
对特定接口放行 SQLi 检测(保留其他防护):
SecRule REQUEST_URI "@beginsWith /api/search" "id:1002,phase:1,pass,nolog,ctl:ruleRemoveByTag=OWASP_CRS"
禁用高误报单条规则,而非整类:
SecRuleRemoveById 942100
(仅移除 URI 层 SQLi 检测,保留 POST body 检测) 所有调整建议写在虚拟主机配置或
modsecurity.conf
末尾,避免覆盖 CRS 原始逻辑。 验证拦截是否真生效 光看日志里有没有 “blocked” 不够,关键看三件事: 发起测试请求:
curl "http://localhost/login.php?user=admin' OR '1'='1"
检查 Apache 错误日志(
/var/log/apache2/error.log
)中是否有
Matched "rx ..." at ARGS:user
+
denied
字样 确认响应返回的是 403 状态码,且页面无数据库报错或用户信息泄露 如果匹配了但没拒绝,回头重点查
SecRuleEngine
是否真为 On 、
crs-setup.conf
是否加载、以及该规则所在 phase(如 phase:2 规则不会处理 GET 参数)是否匹配你的请求类型。

相关文章