如何打造好用的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,..."
绕过原理:
cmdLine转换函数会删除反斜杠\- Apache解析双斜杠
\\为单斜杠 - 导致
..\secret被转换为..secret而绕过检测
解决方案:
- 修改正则表达式为
(?:^|[\\\\/])\.\.(?:[\\\\/]|$) - 或调整转换函数顺序
七、最佳实践建议
-
合理设置Paranoia Level(PL):
- PL1: 基本防护,低误报
- PL2: 中等防护
- PL3/PL4: 严格防护,可能高误报
-
转换函数使用原则:
- 注意函数执行顺序
- 测试关键函数的实际效果
-
规则调优建议:
- 根据应用特性启用/禁用特定规则
- 定期更新规则集
- 结合实际攻击日志调整规则阈值
-
性能考虑:
- 复杂正则表达式可能影响性能
- 高PL级别会增加处理开销