gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:34:48 29 4
gpt4 key购买 nike

我做了很多研究,找到了很多东西,但还没有能够确定一些可以满足我需要的东西。首先,我在运行 ModSecurity 2.7.3 的 CentOS 7 服务器上。

目标

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

警告

我认为我无法通过 ID 删除规则(除非我的理解有缺陷)。我们目前正在临时服务器上进行设置,然后我们将安装 ModSecurity 和我们在临时服务器上设置的排除项,并将它们复制到实时服务器。我认为规则 ID 不会与暂存日志中的匹配(除非我误解了某些内容),并且将 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 (写得很好),here , here ,和here

奖励积分

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

最佳答案

您对 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:ruleRemoveTargetByTag="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 命令,还可以让您访问所有 ModSecurity 规则命令(尽管 ctl 似乎可以处理大多数事情)。尽管这些需要每个参数一个链式规则。

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

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

最后,您可以(并且应该!)将 ModSecurity 放在您的实时服务器上,最初处于“仅检测”模式,这样它将记录所有违规行为,但不会阻止它们:

SecRuleEngine DetectionOnly

然后,当您微调规则时,您会看到误报率下降,直到您愿意完全打开它为止。

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

关于apache - 如何跳过 ModSecurity 中路径中参数的某些规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232609/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com