如何配置ModSecurity规则集以精准拦截SQL注入

小浩酱_4809

小浩酱_4809

2026-10-01

320人浏览

原创

modsecurity 需显式启用模块加载、secrequestbodyaccess、secruleengine on 及 deny 动作才能拦截 sql 注入;缺一即失效,调试须优先验证 nginx -v、请求体透传与规则引擎配置。

如何配置modsecurity规则集以精准拦截sql注入

ModSecurity 本身不拦截 SQL 注入,CRS 规则集默认只记录不阻断;必须显式启用请求体解析、透传、规则引擎和 deny 动作,缺一即失效。

确认 nginx 真正加载了 ModSecurity 模块

很多配置看似正确却完全不生效,根源是模块压根没加载成功。

  • 执行 nginx -V 2>&1 | grep -o modsecurity,必须有非空输出(如 --add-dynamic-module=../nginx-modsecurity),否则所有 SecRule 指令都会报 unknown directive
  • ldd $(which nginx) | grep modsecurity 无输出,说明动态链接失败,load_module 路径写错或 so 文件权限不对
  • 常见错误:路径写成 modules/ngx_http_modsecurity_module.so,但实际在 /usr/lib/nginx/modules/ngx_http_modsecurity_module.so,少一个斜杠就静默失败

必须开启 SecRequestBodyAccess 并透传原始 body

OWASP CRS 的 REQUEST-942-APPLICATION-ATTACK-SQLI.conf 默认检查 REQUEST_BODY 和 ARGS_POST,而 Nginx 默认不读取也不转发 POST body。

AVC.AI
AVC.AI

AVC.AI是一款提供图片和视频增强、修复、上色和抠图的在线 AI 工具平台。

下载
  • SecRequestBodyAccess On 必须写在 modsecurity.conf 全局配置中,不能只放在 location 块里
  • 后端是 PHP-FPM:对应 location ~ \.php$ 中加 fastcgi_pass_request_body on;
  • 后端是 proxy_pass(如 Node.js):对应 location 中加 proxy_pass_request_body on;
  • 对 multipart/form-data 请求,Nginx connector 解析不完整,建议加兜底规则:SecRule REQUEST_BODY "@rx (?i)(union\s+select|select\s+.*\s+from)" "id:1002,phase:2,deny,status:403,msg:'Raw SQLi in body'"

规则引擎与动作必须设为阻断模式

CRS 默认策略是 SecRuleEngine DetectionOnly,日志里全是匹配记录,但请求照常通过。

  • SecRuleEngine On 必须写在 server 或 location 块内,不能只放在 http{} 顶层(否则不生效)
  • 检查 CRS 规则文件中是否含 deny,status:403,例如 REQUEST-942-APPLICATION-ATTACK-SQLI.conf 中的 id:942100 规则末尾必须带该动作
  • 首次上线务必先用 DetectionOnly 运行 3–5 天,观察 modsec_audit.log:正常 order by id、limit 10 都可能触发误报
  • 若业务大量用 LIKE '%xxx%',需临时禁用 id:942100(LIKE 检测规则),否则搜索功能全 403

绕过防御的常见手法及补救

真实攻击者不会发 union select,而是用大小写、注释、URL 编码等组合绕过——只靠 CRS 默认正则远远不够。

  • 正则必须启用转换链:t:urlDecodeUni,t:lowercase,否则 sel%65ct 或 UNI/**/ON SEL/**/ECT 直接漏过
  • 不要只写 union\s+select,应覆盖空格、制表符、换行、注释符:(?i)union[\s%09%0a%0b%0c%0d\xA0](?:/\*\*\/|--+|#)?\s+select
  • 加一层 map 快速兜底:map $args $sql_flag { ~*[\"'`;\(\)\/\*%00] 1; ~*(select|union|insert|update|delete|drop|sleep|benchmark) 1; default 0; },再用 if ($sql_flag = 1) { return 403; }
  • map 只能匹配 GET 参数,POST body 仍依赖前面的 SecRequestBodyAccess 配置,两者缺一不可

最易被忽略的点:规则生效依赖完整的请求处理链路——从模块加载、请求体读取、变量注入、转换函数执行,到最终动作触发。任何一个环节断开,防御就形同虚设。调试时别只盯着规则内容,先确认 nginx -V、SecRequestBodyAccess、fastcgi_pass_request_body 三者是否全部到位。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3903

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

831

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1009

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5741

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2683

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5720

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7541

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1030

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

892

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习