apache 如何在ModSecurity中跳过路径中参数的某些规则?

5lhxktic  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(119)

我做了大量的研究,我发现了很多东西,但还没有能够确定一些东西,将做我需要它做的事情。
目标
我希望能够扫描除某些参数之外的所有参数,并通过所有已设置的标准核心规则运行它们。例如,如果我有一个文件path/to/myfile.php,它有2个参数发送给它param1param2。当用户点击myfile.php时,我希望它运行所有可爱的检查,它可以对param1param2,除了param2。t不需要它检查WEB_ATTACK/XSS,因为它应该为该字段(或任何其他字段)期待一些HTML。
警告
我不认为可以按ID删除规则(除非我的理解有缺陷)。我们目前正在一个临时服务器上设置这个,然后我们将安装ModSecurity和我们在临时服务器上设置的排除项,并将它们复制到活动服务器上。(再次,除非我误解了什么),在我们的实时服务器上抛出ModSecurity并等待规则开始运行并不“有趣”。
到目前为止我所得到的
我试过了...

<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)?

yqlxgs2m

yqlxgs2m1#

你对id的理解有缺陷的。规则id应该在staging和live上是一样的--除非你在它们上运行不同的规则(如果不是一个真正的live的相似之处,这就有点打败了staging服务器的意义)。大多数人下载,购买或编写一个规则集,OWASP核心规则集是一个流行的(和免费的!)规则集。
有一个几乎与您要在ctl文档中执行的操作相同的示例,您链接到了该文档,但使用了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:ruleRemoveTargetByTag="OWASP_CRS/WEB_ATTACK/XSS";ARGS:param2

请注意,OWASP_CRS标记实际上是"OWASP_CRS/WEB_ATTACK/XSS",而不仅仅是"WEB_ATTACK/XSS",并且不确定它是否会匹配部分位,因此请将完整文本放入,假设这是您正在使用的规则集。
同样,如果您确实要以类似方式将param 3列入白色名单,则此行中可以有多个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要更改的规则,但需要在之前指定ctl amends要修改的规则。

需要注意的是,Location和LocationMatch不适用于阶段1的规则(因为它们在Apache运行Location和LocationMatch逻辑之前处理),因此我更喜欢使用ModSecurity REQUEST_URI。即使对于阶段2和更高的规则,为了一致性,它们也应该在Location和LocationMatch部分工作。
最后,您可以(而且应该!)将ModSecurity放在您的活动服务器上,最初处于DetectionOnly模式,这样它将记录所有违规,但不会阻止它们:

SecRuleEngine DetectionOnly

然后,当你微调规则时,你会看到误报的下降,直到你完全舒服地打开它。
顺便说一句,我强烈推荐ModSecurity的原作者在他离开之前写的the ModSecurity handbook。自从ModSecurity 2.6以来还没有更新过,但是,除了id成为强制性的之外,它所涵盖的一切仍然是相关的,并将给予您一个良好的基础,在ModSecurity,然后您可以查看ModSecurity发行说明(无论是在你的安装或here),看看有什么变化。也会建议你升级到最新版本(2.9.1)作为相当多的错误修复自2.7.3。

相关问题