Mod安全白名单,多种条件

时间:2015-05-05 22:05:41

标签: owasp mod-security

我已经使用Owasp预定义的modsec规则在我的服务器上设置了mod_security。

然而,我得到了很多误报,所以我开始设置白名单规则。

我对此网址有误报:

http://example.com/fr/share/?u=http%3A%2F%2Fwww.example.com%2Fen%2Ffiles%2Fimgs%2F%3Fpage%3D100%2

“检测到多个URL编码”,“OWASP_CRS / PROTOCOL_VIOLATION / EVASION” 由于规则:

SecRule ARGS  "\%((?!$|\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" "phase:2,rev:'2',ver:'OWASP_CRS/2.2.9',maturity:'6',accuracy:'8',t:none,block,msg:'Multiple URL Encoding Detected',id:'1',tag:'OWASP_CRS/PROTOCOL_VIOLATION/EVASION',severity:'4',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:tx.%{rule.id}-OWASP_CRS/PROTOCOL_VIOLATION/EVASION-%{matched_var_name}=%{matched_var}"

所以我的主要想法是创建一个仍然进行检查的规则,除了url上的参数“u”,以/ fr / share /?开头。

我有一些提示:

SecRule ARGS|!ARGS:u ... but how can I combine  the mention where !REQUEST_URI equal to "/fr/share?.*"

1 个答案:

答案 0 :(得分:2)

所以这里有几个选项。

你可以重写规则,并使用链接来测试多个条件(注意我出于格式化原因而剥离了一些规则操作):

  SecRule ARGS  "\%((?!$|\W)|[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" \
  "phase:2,rev:'2',ver:'OWASP_CRS/2.2.9',maturity:'6',accuracy:'8', \
  t:none,block,msg:'Multiple URL Encoding Detected',id:'1',chain"
    SecRule REQUEST_URI "!@beginsWith /fr/share/" "t:none"

“链”操作意味着下一行的规则也必须在采取操作之前通过,因此在这种情况下,它检查REQUEST_URI不以/ fr / share开头。

但是,这意味着您拥有自己的此规则副本,并且更难以升级到核心规则集的未来版本。最好保留原始规则(我已查询并且实际上是规则ID 950109,而不是您给出的规则ID 1,因此我认为规则1是您的副本)。

所以,要保留原来的规则,但不要虚假警告你有几个选项,下面详细介绍了复杂性:

您可以停用整个规则:

SecRuleRemoveById 950109

这应该在定义规则后指定。

显然,如果它仅对某个特定的URL,参数组合给出误报,并且意味着您失去了规则为您提供的任何其他网址或参数的保护,那就有点极端了。

您可以仅为该'u'参数禁用该规则:

SecRuleUpdateTargetById 950109 !ARGS:'u'

我认为这可以在定义规则之前或之后指定,但不能100%确定。

但是这会禁用所有'u'参数,你只想为这个特定的呼叫禁用它,所以稍微好些但仍然不是你想要的。

因此,最好的方法是在与URL匹配的规则上使用ctl操作来更改该参数的原始规则:

SecRule REQUEST_URI "@beginsWith /fr/share/" \
"t:none,id:1,nolog,pass,ctl:ruleRemoveTargetById=950109;ARGS:u"

对于规则981260,您要求的几乎完全相同的请求在此处记录: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#ctl