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