MODSecurity-刨析规则

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值