modsecurity命中规则后的动作
-
allow: 命中了某条规则后,不需要对请求/响应应用其它规则,直接让请求通过。这个可以用于白名单。
-
block: 并不是一个真正的动作,它的行为取决于配置的默认动作,如果默认动作更新,使用block的规则行为也随即改变。在安全响应方面,它可用于批量进行规则作为更新。
-
deny: 中断规则处理,拦截请求/响应。在客户端的角度来说,这个动作会返回4xx或5xx的状态码(取决于规则定义status),但并没有中断当前的连接
-
drop: 对当前tcp连接进行关闭操作,它和deny的不同是:deny之后,客户端仍然可以提交请求,但使用drop后,客户端只有重新连接才可以访问。这个动作可以节省后端服务的连接数
-
pass: 命中某条规则继续匹配下一条规则。可用于对请求进行精细地过滤,但会对响应速度有较大影响。
-
pause: 命中某条规则,对当前事务暂停指定的毫秒。一般用于防止登录爆破。如果遭受DDOS攻击,会恶化整个web服务的响应速度
-
proxy: 把命中规则的请求转发到另外一个web服务去。这个功能类似反向代理。由于它对客户端完全来说,完全是无感知,可以用它导向请求到蜜罐系统。这个动作是一个非常优秀的动作。
-
redirect: 当规则被命中,它会返回一个重定向,指示浏览器访问另外一个url。它和proxy的区别是,它对客户端是感知。可用于配置新上线接口或屏蔽某些有问题的接口。
非获取匹配
匹配
(?:pattern):匹配指定内容,不形成组,一般与 | 搭配使用
(?!:pattern):匹配指定内容,不形成组,一般与 | 搭配使用,不区分大小写
预查模式
提取判断某区域是否为指定内容;不消耗字符内容,每次预查位置开始往前/后搜索
(?=pattern):正向肯定预查,从左向右查看文本,尝试匹配规则。一般用于后缀肯定判断
(?!pattern): 正向否定预查,从左向右查看文本,尝试匹配规则。一般用于后缀的否定判断
(?<=pattern): 反向肯定预查,从右向左查看文本,尝试匹配规则。一般用于前缀的肯定判断
(?<!pattern): 反向否定预查,从右向左查看文本,尝试匹配规则。一般用于前缀的否定判断
(?:pattern) VS (?=pattern)
共同点:
(?:pattern) 与 (?=pattern)都匹配pattern,但不会把pattern结果放到Matches的集合中。
区别:
(?:pattern) 匹配得到的结果包含pattern。 (?=pattern) 则不包含。
规则举例
示例:以某规则为例
该规则用以防范远程代码执行攻击,会在阶段2(请求体阶段)检查cookie值、cookie中字段名称、请求参数名称、请求参数值等变量中的字符串是否匹配正则表达式(检查 Windows FOR/IF 命令)中的内容。
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* "@rx \b(?:if(?:/i)?(?: not)?(?: exist\b| defined\b| errorlevel\b| cmdextversion\b|(?: |\().*(?:\bgeq\b|\bequ\b|\bneq\b|\bleq\b|\bgtr\b|\blss\b|==))|for(?:/[dflr].*)? %+[^ ]+ in\(.*\)\s?do)" \
"id:932140,\
phase:2,\
block,\
capture,\
t:none,t:urlDecodeUni,t:cmdLine,\
msg:'Remote Command Execution: Windows FOR/IF Command Found',\
logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\
tag:'application-multi',\
tag:'language-shell',\
tag:'platform-windows',\
tag:'attack-rce',\
tag:'paranoia-level/1',\
tag:'OWASP_CRS',\
tag:'capec/1000/152/248/88',\
tag:'PCI/6.5.2',\
ctl:auditLogParts=+E,\
ver:'OWASP_CRS/3.3.2',\
severity:'CRITICAL',\
setvar:'tx.rce_score=+%{tx.critical_anomaly_score}',\
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'"
示例:
get请求,请求路径:
编码前:/?test=for /r xxx %i in (*.txt) do @echo %i
编码后:/?test=for%20/r%20xxx%20%i%20in%20(*.txt)%20do%20@echo%20%i
规则刨析
SecRule 创建一个使用所选运算符分析指定变量的规则
----------------------------------------------------------------------------
REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/*
REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/ 排除cookie值为:/__utm/外,所有请求cookie的集合(仅包含值),__utm不做为检查项
REQUEST_COOKIES_NAMES 所有请求cookie的名称的集合
ARGS_NAMES 所有请求参数名称
ARGS 请求参数的集合
XML 用于与XML解析器交互的特殊集合
@rx 使用正则表达式进行检查
-------------------------------------------------------------------------------------
\b
(?:if
(?:/i)?
(?: not)?
(?: exist\b| defined\b| errorlevel\b| cmdextversion\b|
(?: |\().*
(?:\bgeq\b|\bequ\b|\bneq\b|\bleq\b|\bgtr\b|\blss\b|==)
)
|for(?:/[dflr].*)? %+[^ ]+ in\(.*\)\s?do)
可以进行匹配的字段:
if not exist if/i not exist if exist
if not errorlevel if/i not errorlevel if errorlevel
if not cmdextversion if/i not cmdextversion if cmdextversion
# /i not被?约束,即/i可以不存在,亦可以存在;not同理,如上述样例
if (xx)ege
if (xx)equ
if (xx)neq
if (xx)leq
if (xx)gtr
if (xx)lss
if (xx)==
for/dxxx %xx in(xxx) do
--------------------------------------------------------------------------------------------
"id:11101,\ #规则id
phase:2,\ #配置规则或规则链的处理阶段:2-请求阶段 4-响应阶段 5-日志记录阶段
block,\ #执行SecDefaultAction定义的阻断性动作
capture,\ #与正则表达式运算符(@rx)一起使用时,捕获操作将创建正则表达式捕获的副本,并将它们放入事务变量集合中
t:none,t:urlDecodeUni,t:cmdLine,\
#t:none用于删除当前规则关联的所有转换函数
#t:urlDecodeUni:解码URL编码的输入字符串,支持Microsoft特定的%u编码
#t.cmdLine:解决Windows和Unix中转义字符不同的问题
msg:'Remote Command Execution: Windows FOR/IF Command Found',\
#msg:将自定义信息分配给规则或规则链。 该消息将与每次警报一起记录到日志中。
logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',\
#logdata:将指定的数据片段记录为警报消息的一部分
#tag:为规则或链指定标记(类别)
tag:'application-multi',\
tag:'language-shell',\
tag:'platform-windows',\
tag:'attack-rce',\
tag:'paranoia-level/1',\
tag:'OWASP_CRS',\
tag:'capec/1000/152/248/88',\
tag:'PCI/6.5.2',\
ctl:auditLogParts=+E,\
#ctl:在此次访问的基础上,临时修改ModSecurity配置。使用此操作所做的任何更改都将仅影响此次访问。
ver:'OWASP_CRS/3.3.2',\ #指定规则集版本。
severity:'CRITICAL',\ #指定规则的严重性。
setvar:'tx.rce_score=+%{tx.critical_anomaly_score}',\
# setvar:创建,删除或更新变量。变量名称不区分大小写。
setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'"
#要创建变量并将其值设置为1(通常用于设置标志),请使用:setvar:TX.score
#要创建变量并同时对其进行初始化,请使用:setvar:TX.score=10
#要删除变量,请在名称前加上感叹号:setvar:!TX.score
#要增加或减少变量值,请在数值前面使用+和 - 字符:setvar:TX.score=+5