如何打造好用的ModSecurity系列 Part 3
字数 2728 2025-08-09 15:23:02

ModSecurity规则详解与实战指南

一、ModSecurity规则基础结构

1.1 规则通用格式

SecRule VARIABLES OPERATOR [TRANSFORMATION_FUNCTIONS, ACTIONS]

1.2 规则组成要素

  • 变量(VARIABLES): 指定要检查的数据来源
  • 操作符(OPERATOR): 定义匹配条件
  • 转换函数(TRANSFORMATION_FUNCTIONS): 对数据进行预处理
  • 动作(ACTIONS): 匹配后的处理行为

二、变量详解

2.1 请求变量(Request variables)

变量 描述 类型
ARGS 所有请求参数 read-only collection
ARGS_COMBINED_SIZE 请求参数总大小 -
ARGS_GET 查询字符串参数 read-only collection
ARGS_POST 请求体参数 read-only collection
FILES 上传文件域 read-only collection
FILES_NAMES 上传文件表单参数名 read-only collection
REQUEST_HEADERS 请求头 read-only collection
REQUEST_METHOD 请求方法 -
REQUEST_URI 请求URI(不含hostname) -

2.2 服务器变量(Server variables)

变量 描述
REMOTE_ADDR 客户端IP地址
SERVER_NAME 服务器hostname(取自Host头)
SERVER_PORT 服务器端口

2.3 响应变量(Response variables)

变量 描述 可用阶段
RESPONSE_BODY 响应体 -
RESPONSE_HEADERS 响应头 代理模式阶段5
RESPONSE_STATUS 响应状态码 仅代理模式

2.4 解析标志(Parsing flags)

标志 描述
MULTIPART_BOUNDARY_QUOTED multipart边界含引号
REQBODY_PROCESSOR_ERROR 请求体解析错误标记(1=错误)
URLENCODED_ERROR URL编码解析错误

三、操作符与转换函数

3.1 常用操作符

操作符 描述
rx 正则表达式匹配
pm 特征字符串匹配(不区分大小写)
beginsWith 以...开头
contains 包含
validateByteRange 验证字节范围
geoLookup IP地理位置查询

3.2 关键转换函数

函数 描述
base64Decode Base64解码
urlDecode URL解码
htmlEntityDecode HTML实体解码
removeNulls 删除空字节
normalizePath 规范化路径(移除多余斜杠)
cmdLine 处理命令行特殊字符

四、动作详解

4.1 基本动作

动作 描述 版本差异
allow 允许请求 2.5+影响所有阶段
deny 拒绝请求并返回错误页 -
drop 直接断开连接 -
pass 继续下一条规则 -

4.2 流程控制动作

动作 描述
chain 规则链(AND逻辑)
skip 跳过指定数量规则
skipAfter 跳转到指定规则

4.3 其他重要动作

动作 描述
id 设置规则ID
phase 指定处理阶段
capture 捕获结果到TX变量
setvar 设置变量

五、核心规则集解析

5.1 规则文件结构

901-INITIALIZATION.conf    # 初始化
903-APPLICATION-ATTACK.conf # 应用攻击防护
905-COMMON-EXCEPTIONS.conf # 常见例外处理
910-IP-REPUTATION.conf    # IP信誉
911-METHOD-ENFORCEMENT.conf # 方法限制
912-DOS-PROTECTION.conf   # DoS防护
...

5.2 关键防护规则

5.2.1 协议强制规则(920)

  • 920100: 验证请求行格式
  • 920120: 文件名和参数名验证
  • 920160: Content-Length必须为数字
  • 920270: ASCII字符范围限制(PL1)

5.2.2 协议攻击防护(921)

  • 921110: HTTP走私攻击检测
  • 921120: HTTP响应拆分攻击
  • 921170/921180: HTTP参数污染防护

5.2.3 本地文件包含防护(930)

  • 930110: 路径遍历攻击检测(/../, \..\)
  • 930120: 常见敏感文件检测

5.2.4 远程命令执行防护(932)

  • 932100: Unix命令拦截
  • 932110: Windows命令拦截
  • 932130: 命令注入绕过检测

六、绕过案例分析与防御

6.1 路径遍历绕过案例

原始规则(930110):

SecRule REQUEST_URI|ARGS|... "@rx (?:(?:^|[\\/])\.\.[\\/]|[\\/]\.\.(?:[\\/]|$))" \
    "id:930110,...,t:cmdLine,..."

绕过原理:

  1. cmdLine转换函数会删除反斜杠\
  2. Apache解析双斜杠\\为单斜杠
  3. 导致..\secret被转换为..secret而绕过检测

解决方案:

  1. 修改正则表达式为(?:^|[\\\\/])\.\.(?:[\\\\/]|$)
  2. 或调整转换函数顺序

七、最佳实践建议

  1. 合理设置Paranoia Level(PL):

    • PL1: 基本防护,低误报
    • PL2: 中等防护
    • PL3/PL4: 严格防护,可能高误报
  2. 转换函数使用原则:

    • 注意函数执行顺序
    • 测试关键函数的实际效果
  3. 规则调优建议:

    • 根据应用特性启用/禁用特定规则
    • 定期更新规则集
    • 结合实际攻击日志调整规则阈值
  4. 性能考虑:

    • 复杂正则表达式可能影响性能
    • 高PL级别会增加处理开销

八、参考资料

  1. ModSecurity官方文档
  2. ModSecurity中文参考
  3. OWASP CRS项目
ModSecurity规则详解与实战指南 一、ModSecurity规则基础结构 1.1 规则通用格式 1.2 规则组成要素 变量(VARIABLES) : 指定要检查的数据来源 操作符(OPERATOR) : 定义匹配条件 转换函数(TRANSFORMATION_ FUNCTIONS) : 对数据进行预处理 动作(ACTIONS) : 匹配后的处理行为 二、变量详解 2.1 请求变量(Request variables) | 变量 | 描述 | 类型 | |------|------|------| | ARGS | 所有请求参数 | read-only collection | | ARGS_ COMBINED_ SIZE | 请求参数总大小 | - | | ARGS_ GET | 查询字符串参数 | read-only collection | | ARGS_ POST | 请求体参数 | read-only collection | | FILES | 上传文件域 | read-only collection | | FILES_ NAMES | 上传文件表单参数名 | read-only collection | | REQUEST_ HEADERS | 请求头 | read-only collection | | REQUEST_ METHOD | 请求方法 | - | | REQUEST_ URI | 请求URI(不含hostname) | - | 2.2 服务器变量(Server variables) | 变量 | 描述 | |------|------| | REMOTE_ ADDR | 客户端IP地址 | | SERVER_ NAME | 服务器hostname(取自Host头) | | SERVER_ PORT | 服务器端口 | 2.3 响应变量(Response variables) | 变量 | 描述 | 可用阶段 | |------|------|----------| | RESPONSE_ BODY | 响应体 | - | | RESPONSE_ HEADERS | 响应头 | 代理模式阶段5 | | RESPONSE_ STATUS | 响应状态码 | 仅代理模式 | 2.4 解析标志(Parsing flags) | 标志 | 描述 | |------|------| | MULTIPART_ BOUNDARY_ QUOTED | multipart边界含引号 | | REQBODY_ PROCESSOR_ ERROR | 请求体解析错误标记(1=错误) | | URLENCODED_ ERROR | URL编码解析错误 | 三、操作符与转换函数 3.1 常用操作符 | 操作符 | 描述 | |--------|------| | rx | 正则表达式匹配 | | pm | 特征字符串匹配(不区分大小写) | | beginsWith | 以...开头 | | contains | 包含 | | validateByteRange | 验证字节范围 | | geoLookup | IP地理位置查询 | 3.2 关键转换函数 | 函数 | 描述 | |------|------| | base64Decode | Base64解码 | | urlDecode | URL解码 | | htmlEntityDecode | HTML实体解码 | | removeNulls | 删除空字节 | | normalizePath | 规范化路径(移除多余斜杠) | | cmdLine | 处理命令行特殊字符 | 四、动作详解 4.1 基本动作 | 动作 | 描述 | 版本差异 | |------|------|----------| | allow | 允许请求 | 2.5+影响所有阶段 | | deny | 拒绝请求并返回错误页 | - | | drop | 直接断开连接 | - | | pass | 继续下一条规则 | - | 4.2 流程控制动作 | 动作 | 描述 | |------|------| | chain | 规则链(AND逻辑) | | skip | 跳过指定数量规则 | | skipAfter | 跳转到指定规则 | 4.3 其他重要动作 | 动作 | 描述 | |------|------| | id | 设置规则ID | | phase | 指定处理阶段 | | capture | 捕获结果到TX变量 | | setvar | 设置变量 | 五、核心规则集解析 5.1 规则文件结构 5.2 关键防护规则 5.2.1 协议强制规则(920) 920100 : 验证请求行格式 920120 : 文件名和参数名验证 920160 : Content-Length必须为数字 920270 : ASCII字符范围限制(PL1) 5.2.2 协议攻击防护(921) 921110 : HTTP走私攻击检测 921120 : HTTP响应拆分攻击 921170/921180 : HTTP参数污染防护 5.2.3 本地文件包含防护(930) 930110 : 路径遍历攻击检测( /../ , \..\ ) 930120 : 常见敏感文件检测 5.2.4 远程命令执行防护(932) 932100 : Unix命令拦截 932110 : Windows命令拦截 932130 : 命令注入绕过检测 六、绕过案例分析与防御 6.1 路径遍历绕过案例 原始规则(930110) : 绕过原理 : cmdLine 转换函数会删除反斜杠 \ Apache解析双斜杠 \\ 为单斜杠 导致 ..\secret 被转换为 ..secret 而绕过检测 解决方案 : 修改正则表达式为 (?:^|[\\\\/])\.\.(?:[\\\\/]|$) 或调整转换函数顺序 七、最佳实践建议 合理设置Paranoia Level(PL) : PL1: 基本防护,低误报 PL2: 中等防护 PL3/PL4: 严格防护,可能高误报 转换函数使用原则 : 注意函数执行顺序 测试关键函数的实际效果 规则调优建议 : 根据应用特性启用/禁用特定规则 定期更新规则集 结合实际攻击日志调整规则阈值 性能考虑 : 复杂正则表达式可能影响性能 高PL级别会增加处理开销 八、参考资料 ModSecurity官方文档 ModSecurity中文参考 OWASP CRS项目