Modsecurity 语法

Modsecurity 语法

https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual

Configuration Directives

  • SecRule
  • SecMarker 配合 skipAfter 约等于 goto

phase

  • 1 request header
  • 2 request body
  • 3 response header
  • 4 response body

Variables

ARGS

http://afdafa.com/?a=1234&b=2345

ARGS:[“1234”, “2345”]

ARGS_NAMES:[“a”, “b”]

ARGS 会默认 urldecode

FILES

完整的上传文件的文件名列表

FILES_NAMES

Content-Disposition: form-data; name=”upfile”; filename=”cmdjsp.jsp”

upfile

MULTIPART_FILENAME

FILES 的最后一个元素

MULTIPART_NAME

FILES_NAMES 的最后一个元素

REQUEST_BASENAME

http://a.com/b/c/d.php?a=1

不包括路径,只有文件名, d.php

REQUEST_FILENAME

包括路径, /b/c/d.php

Disruptive actions

  • allow 全局允许
  • pass 此条规则允许
  • block
  • drop
  • deny

注意事项

& 操作符

1
&REQUEST_HEADERS_NAMES
里面元素个数
1
2
3
4
5
6
7
8
9

### 取反操作
```SecRule ARGS "@rx 123" "phase:2,id:'1234', msg:'xxx',log,block"```
只要有一个参数里包含 123

```SecRule ARGS "!@rx 123" "phase:2,id:'1234', msg:'xxx',log,block"```
只要有一个参数不包括 123 就满足条件

### 从变量集合中排除特定元素

SecRule ARGS|!ARGS:z dirty “id:9”

1
2
3
4
5
6
7
8
从 ARGS 中匹配,且不包括 p 参数

```SecRule ARGS|ARGS_NAMES|!ARGS:/id$/|!ARGS:p dirty "id:9"```
从 ARGS 与 ARGS_NAMES 中匹配,且排除 ARGS 中以 id 结束的参数,且排除 ARGS 中 p 参数

### 调试信息
#### 方法1 调高 SecDebugLogLevel 的值,最大为 9
#### 方法2 日志记录(print 大法)

SecRule REQUEST_LINE “HTTP” “phase:2, log, logdata:%{ARGS}, block,id:’9000’”
SecRule ARGS “@rx %aa” “phase:2, block,msg:’xxx’,log, logdata:%{matched_var}, id:’1234’”

logdata 记录要查看的变量

## 其它说明
* 正则或者其它字符串比较的操作,正则或字符串不能小于3个字符
* 要使用 tx.[0-9] 时必须使用 capture 指令