我已经使用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?.*"
答案 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