ModSecurity SQL注入规则仅拦截带引号输入的问题求助
ModSecurity 942100规则SQL注入拦截异常问题解决
问题现象
在PHP应用中配置ModSecurity后,使用REQUEST-942-APPLICATION-ATTACK-SQLI.conf中的942100规则检测SQL注入时出现如下异常:
- 带引号的SQL语句(如
SELECT * from users WHERE name='test')能被正常拦截 - 不带引号的语句(如
SELECT * from users WHERE id=1)或无WHERE条件的查询语句(如Select * from users)无法被拦截,请求直接存入数据库
场景截图
场景1(正常拦截)


场景2(拦截失败)


原因分析
942100规则的核心逻辑是检测带单/双引号的SQL注入模式,主要针对通过闭合字符串引号构造的注入攻击。而不带引号的数字型注入、无WHERE条件的全表查询这类场景,不在该规则的检测范围内,因此无法触发拦截。
解决方案
1. 启用更多CRS SQLI规则
REQUEST-942-APPLICATION-ATTACK-SQLI.conf中包含多个覆盖不同场景的SQL注入规则,除942100外,需启用以下规则补充检测:
- 942110:检测基于注释的SQL注入
- 942120:检测基于UNION的SQL注入
- 942130:检测基于错误的SQL注入
- 942140:检测基于布尔的SQL注入
- 942150:检测基于时间延迟的SQL注入
确保这些规则未被注释,在CRS配置中正常启用。
2. 扩大规则检测范围
检查ModSecurity配置,确保规则扫描请求参数、POST body、JSON数据等所有可能携带注入内容的位置。可通过调整SecRule的目标字段实现,示例:
SecRule REQUEST_COOKIES|REQUEST_BODY|ARGS_NAMES|ARGS "@rx SELECT.*FROM" "id:100001,phase:2,t:none,block,msg:'检测无引号SQL注入尝试'"
3. 升级至最新版CRS
OWASP Core Rule Set(CRS)会持续更新规则覆盖新型攻击,若使用旧版本,建议升级到最新版,新版本对无引号SQL注入场景有更完善的检测逻辑。
4. 自定义补充规则
若现有规则仍无法覆盖业务场景,可添加自定义规则:
- 针对无WHERE条件的全表查询:
SecRule ARGS|REQUEST_BODY "@rx (?i)^SELECT\s+\*\s+FROM\s+\w+" "id:900001,phase:2,block,msg:'检测全表查询SQL尝试',severity:CRITICAL"
- 针对数字型无引号注入:
SecRule ARGS|REQUEST_BODY "@rx (?i)WHERE\s+\w+\s*=\s*\d+" "id:900002,phase:2,block,msg:'检测无引号数字型SQL注入尝试',severity:CRITICAL"
5. 检查基础配置正确性
确认SecRuleEngine设置为On(而非DetectionOnly),确保规则处于拦截模式;同时检查是否完整加载了CRS所有规则文件,无依赖遗漏。
内容的提问来源于stack exchange,提问作者user3003366
相关产品推荐
相关产品推荐

