如何跳过ModSecurity中路径中参数的确定规则?

时间:2016-07-06 19:51:28

标签: apache security mod-security

我做了很多研究,我发现了很多东西,但是还没能找到能做我需要做的事。首先,我在运行ModSecurity 2.7.3的CentOS 7服务器上。

目标

我希望能够扫描除了某些参数之外的所有参数,并通过已经设置的所有标准核心规则运行它们。例如,如果我有一个文件path/to/myfile.php,并且它有2个参数可以发送给它param1param2。当用户点击myfile.php时,我希望它能够对param1param2进行所有可爱的检查,除了param2我不需要检查WEB_ATTACK/XSS因为它应该期待该字段的某些HTML(或其他)。

买者

我认为我不能通过ID删除规则(除非我的理解存在缺陷)。我们目前正在登台服务器上进行设置,然后我们将安装ModSecurity以及我们在登台服务器上设置的排除项,并将它们复制到实时服务器。我不认为规则ID会与登台日志相匹配(除非我误解了某些内容)并且将ModSecurity投放到我们的实时服务器并等待规则开始跳闸并不是“有趣”。 / p>

到目前为止我得到了什么

这是我尝试过的......

<LocationMatch /path/to/myfile.php>
 <IfModule mod_security2.c>
    SecRuleEngine Off # This is super bad I know
 </IfModule>
</LocationMatch>

这是一个坏主意,所以我可以这样做......

<LocationMatch /path/to/myfile.php>
 <IfModule mod_security2.c>
    SecRuleRemoveByTag "WEB_ATTACK/XSS" # better but.....still not close enough
 </IfModule>
</LocationMatch>

所以我尝试过没有成功的东西,如下所示:

SecRule ARGS|!ARGS:param2 "@detectXSS" # only 2.8.0 and above :(
# or
SecRule ARGS|!ARGS:param2 "ctl:ruleRemoveByTag=WEB_ATTACK/XSS"
# or
SecRule REQUEST_FILENAME "@streq /path/to/myfile.php" "pass,ctl:ruleRemoveByTag=WEB_ATTACK/XSS;ARGS:param2"

ModSecurity的文档很好,但我需要更深入的理解,特别是ctl的东西。我还查看了其他一些问题herehere,并在网络上看到了一些帖子,这些帖子帮助我引导我朝着正确的方向前进here(非常好的写作),hereherehere

奖励积分

如果我需要做param2和param3,我是否必须编写2条规则,或者它们可以以某种方式组合(ARGS:param2,param3)?

1 个答案:

答案 0 :(得分:6)

您对ids 的理解存在缺陷。规则ID 应该在暂存时与现场相同 - 除非您对它们运行不同的规则(哪种方式会破坏临时服务器的点,如果不是真实的相似之处)。大多数人下载,购买或编写规则集,其中OWASP核心规则集是一种流行的(并且是免费的!)规则集。

您在ctl documentation中想要执行的操作几乎完全相同,但您使用了ID:

# white-list the user parameter for rule #981260 when the REQUEST_URI is /index.php
 SecRule REQUEST_URI "@beginsWith /index.php" "phase:1,t:none,pass, \
  nolog,ctl:ruleRemoveTargetById=981260;ARGS:user

所以对你来说这会变成:

SecRule REQUEST_URI "@beginsWith /path/to/myfile.php" "id:1234,phase:2,t:none,pass, \
  nolog,ctl:ruleRemoveTargetById=973336;ARGS:param2

注意OWASP CRS(不确定你是否正在使用它?)XSS检查是第2阶段检查,因此为什么我已经改变了这一点,而且从2.7开始,ID现在是强制性的。您可以扩展它以包含许多规则ID或不同的参数:

SecRule REQUEST_URI "@beginsWith /path/to/myfile.php" "phase:2,t:none,pass, \
  nolog,ctl:ruleRemoveTargetById=973336;ARGS:param2,\
  ctl:ruleRemoveTargetById=973337;ARGS:param2,\
  ctl:ruleRemoveTargetById=973338;ARGS:param2,\
  ctl:ruleRemoveTargetById=973336;ARGS:param3

但是,设置所有ID非常繁琐,因此,如果您想通过标记执行此操作,您可以尝试以下哪些应该可以使用但未经测试:

SecRule REQUEST_URI "@beginsWith /path/to/myfile.php" "id:1234,phase:2,t:none,pass, \
  nolog,ctl:ruleRemoveTargetById="OWASP_CRS/WEB_ATTACK/XSS";ARGS:param2

请注意,OWASP CRS标记实际上是"OWASP_CRS/WEB_ATTACK/XSS",而不仅仅是"WEB_ATTACK/XSS",并且不确定它是否与部分位匹配,因此请将全文放入,假设是您正在使用的规则集。

如果您确实想要同样使用白名单param3,那么您可以在此行中执行多个ctl操作。

如果这些都不起作用,您可以使用链式规则而不是ctl操作:

SecRule REQUEST_URI "@beginsWith /path/to/myfile.php" "id:1234,phase:2,t:none,pass,chain \
     SecRuleUpdateTargetByTag "OWASP_CRS:WEB_ATTACK/XSS" !ARGS:param2

这允许检查多个项目,如果没有等效的ctl命令(尽管ctl似乎处理大多数事情),也可以访问所有ModSecurity规则命令。虽然每个参数需要一个链式规则。

重要提示:排序很重要且令人困惑。 SecRuleUpdateTargetByTag应该指定 AFTER 他们正在改变的规则,但需要指定ctl修正之前他们正在修改的规则。

还应该注意,Location和LocationMatch不适用于第1阶段规则(因为它们是在Apache运行Location和LocationMatch逻辑之前处理的),因此我更喜欢使用ModSecurity REQUEST_URI。即使是第2阶段及以上规则,为了保持一致性,尽管它们应该在Location和LocationMatch部分中工作。

最后,您可以(并且应该!)最初将ModSecurity放在您的实时服务器上的DetectionOnly模式中,这样它将记录所有违规但不阻止它们:

SecRuleEngine DetectionOnly

然后,当你微调规则时,你会看到误报的下降,直到你完全开启它为止。

顺便说一句,在他继续前进之前,我强烈推荐由ModSecurity的原作者撰写的the ModSecurity handbook。自从ModSecurity 2.6以来Hasn没有更新,但除了id成为强制性之外,它所涵盖的一切仍然相关,并且将为您提供ModSecurity的良好基础,然后您可以查看ModSecurity发行说明(在您的安装或{ {3}})看看发生了什么变化。还建议您升级到最新版本(2.9.1),因为自2.7.3以来已经修复了很多错误。