如何利用ModSecurity配置拦截高级SQL注入规则?

胖伟酱_7908

胖伟酱_7908

2026-09-06

1011人浏览

原创

高级sql注入拦截依赖三件事:secrequestbodyaccess on必开、t:urldecodeuni和t:lowercase必加、crs初始化规则必须在sqli规则前加载,缺一不可,否则连admin' or '1'='1等基础post攻击都无法检测。

如何利用modsecurity配置拦截高级sql注入规则?

直接上结论:高级 SQL 注入拦截不靠堆正则,靠三件事——SecRequestBodyAccess On 必开、t:urlDecodeUni,t:lowercase 必加、CRS 初始化规则(REQUEST-901-INITIALIZATION.conf)必须在 SQLI 规则前加载。缺一不可,否则连 admin' OR '1'='1 这种基础 POST 攻击都检测不到。

为什么 SecRequestBodyAccess On 是第一道生死线

ModSecurity 默认只解析 URL 参数(ARGS),对 POST 请求体(比如登录表单、JSON API)完全不读——规则再强也形同虚设。

  • 现象:攻击者用 POST /login 提交 username=admin'--&password=123,日志里查不到匹配记录,SecRule ARGS 完全不触发
  • 必须加:SecRequestBodyAccess On(Nginx)或 SecRequestBodyAccess On(Apache)
  • 额外注意:若请求体超大(如上传 JSON 超 1MB),需同步调大 SecRequestBodyLimit 和 SecRequestBodyNoFilesLimit,否则直接被截断丢弃,规则根本没机会运行

怎么让 @rx 规则真正“看得清”变形载荷

真实攻击几乎从不裸写 union select,而是用 URL 编码、大小写混用、空格替换成 %09 或换行符等手法绕过。硬写正则只会误杀+漏报。

知海图Chat
知海图Chat

知海图Chat是基于知乎与面壁智能合作大模型能力的中文知识问答工具。

下载
  • 解码必须显式调用:t:urlDecodeUni 处理 %27union%20select,t:lowercase 统一 UnIoN SeLeCt
  • 空白符不能只写 \s:要匹配 [[:space:]]+ 或 \s+,覆盖 %09(Tab)、%0A(LF)、%0D%0A(CRLF)
  • 注释符要前置捕获:攻击常写 id=1%23%0Aunion select,规则中得用 (?:--|%23|/\*)[[:space:]]* 开头,再接关键字
  • 示例(补漏用,非替代 CRS):SecRule ARGS "@rx (?:--|%23|/\*)[[:space:]]*(?:union|select|insert|delete|update)" "id:1002,phase:2,block,msg:'SQLi: Comment-prefixed keyword',t:urlDecodeUni,t:lowercase"

CRS 的 REQUEST-942-APPLICATION-ATTACK-SQLI.conf 怎么不白装

很多人启用了 CRS 却仍被绕过,问题往往出在加载顺序和变量初始化上——REQUEST_COOKIES、ARGS 这些变量在初始化规则跑完前全是空的。

  • 检查 CRS 版本:v3.3+ 才有较完整的 LibInjection 集成;v4.x 推荐启用 crs-setup.conf 中的 SecAction "id:900100,phase:1,pass,nolog,initcol:ip=%{REMOTE_ADDR},initcol:user=%{REMOTE_ADDR}"
  • 加载顺序铁律:Nginx 中 modsecurity_rules_file 加载的文件,必须先 include REQUEST-901-INITIALIZATION.conf,再 include REQUEST-942-APPLICATION-ATTACK-SQLI.conf
  • 别跳过评分机制:CRS 默认用 setvar:tx.anomaly_score=+%{tx.error_anomaly_score} 累计得分,tx.inbound_anomaly_score_threshold 控制拦截阈值。直接 deny 会误伤,建议先 log,tag:'OWASP_CRS' 观察一周再切 block

上线前必须验证的三个真实场景

规则写完不等于生效。很多团队卡在“看似拦截了,其实只拦住了 20% 的变体”。重点验这三类:

  • POST /api/order?ref_id=123 带 JSON body:{"customer_name":"test' OR '1'='1--"} —— 检查 SecRequestBodyAccess 和 JSON 解析是否开启(SecRule REQUEST_HEADERS:Content-Type "@contains application/json" 后需 t:jsonDecode)
  • URL 中含 %2527(双重编码的 '):/search?q=test%2527%20or%201%3D1 —— 验证 t:urlDecodeUni 是否递归解码(默认只解一层,需叠加 t:urlDecodeUni,t:urlDecodeUni)
  • 业务参数含合法关键词:如论坛帖子标题为 MySQL UNION SELECT 教程 —— 确保规则作用域精确到高风险参数(ARGS:search_query),而非全局 ARGS

最易被忽略的是:LibInjection 检测(942100 等规则)依赖 libinjection C 库编译支持,静态编译的 Nginx 模块若没带该库,这部分规则实际无效——得看 nginx -V 2>&1 | grep -i libinjection 确认。

相关专题

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

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

2023.10.12

4123

8

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

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

2023.10.27

871

4

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

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

2024.02.23

1069

5

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

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

2024.03.06

6001

10

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

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

2024.03.06

2883

4

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

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

2024.04.07

5980

11

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

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

2024.04.29

7981

6

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

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

2024.04.29

1090

5

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

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

2024.04.29

952

5

热门下载

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

精品课程

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

共10课时 | 2.3万人学习