【问题标题】:ModSecurity SecRule RESPONSE_BODY doesn't workModSecurity SecRule RESPONSE_BODY 不起作用
【发布时间】:2019-05-02 18:58:46
【问题描述】:

我有 Ubuntu 18.10 和 apache2libapache2-mod-security2modsecurity-crs 软件包,除了启用 ModSecurity 调试日志和复制 modsecurity.conf-recommended 并添加 SecRuleEngine On 之外,它们的默认配置。

我在/etc/modsecurity/ 的单独文件中添加了一个新的SecRule

/etc/modsecurity/sf4-modsec.conf的内容只有一行:

SecRule RESPONSE_BODY "@rx <script" id:1000137,phase:4,deny,log,status:403

我可以用phase:1 确认正在加载此规则,因为它出现在调试日志中:

[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Recipe: Invoking rule 7f8e0d40d138; [file "/etc/modsecurity/sf4-modsec.conf"] [line "1"] [id "1000137"].
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][5] Rule 7f8e0d40d138: SecRule "RESPONSE_BODY" "@rx <script>" "phase:1,auditlog,id:1000137,deny,log,status:403"
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Rule returned 0.
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][9] No match, not chained -> mode NEXT_RULE.
[02/May/2019:20:48:33 +0200] [localhost/sid#7f8e0d51a5c8][rid#7f8e108d20a0][/_profiler/empty/search/results][4] Recipe: Invoking rule 7f8e0d40f5a0; [file "/etc/modsecurity/crs/crs-setup.conf"] [line "845"] [id "900990"].

但是,如果使用phase:4 指定,它不会出现在日志中(我找不到带有1000137 的行。)

我希望这条规则能够阻止其 HTML 中包含 &lt;script&gt; 的每个页面,但它不会,尽管 &lt;script&gt; 标记 100% 在响应中。 但是,OWASP CRS 设置的已安装规则似乎可以完美运行。

我的响应正文处理配置:

SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml
SecResponseBodyLimit 524288
SecResponseBodyLimitAction Reject

我尝试通过sudo service apache2 restart 多次重启Apache。

我尝试禁用所有 OWASP CRS 规则,但仍然没有帮助。 这是我的第 4 阶段调试日志:https://pastebin.com/8aXk8hL0(很短)

【问题讨论】:

    标签: apache ubuntu owasp mod-security mod-security2


    【解决方案1】:

    您的规则是第 1 阶段规则,它需要是第 4 阶段规则才能查看响应正文。

    phases are as follows:

    1. 请求标头
    2. 请求正文
    3. 响应标头
    4. 响应正文
    5. 日志记录

    因此,阶段 1 规则只能访问请求标头,并且在 Apache 处理请求正文之前以及在 Apache 处理请求和创建响应之前进行处理。

    但是,即使您将此移至第 4 阶段规则,其他规则也可能会停止此阶段的运行。例如,OWASP CRS v2 有一个 optional_rules/modsecurity_crs_10_ignore_static.conf file,其规则如下:

    # HTML
    SecRule REQUEST_FILENAME "\.(?:(?:cs|j)s|html?)$"  "phase:2,t:none,t:lowercase,setvar:tx.text_file_extension=1,allow:phase,nolog,id:'999005',severity:'6'"
    

    在第 2 阶段运行,并表示所有以 .html 结尾的文件(还有 .js 和 .css,但在这里可能不太相关)都已通过(因此跳过第 2 阶段的其余部分,以及第 3 阶段和第 4 阶段 -阶段 5 是一个始终运行的特殊阶段)。这意味着您的第 4 阶段规则不适用于 .html 文件。

    此类规则用于性能原因,因为这些文件如果不是动态生成的,风险较小,因此无需对它们运行完整的规则集。

    如果您真的非常想运行第 4 阶段规则,那么您需要关闭此规则,方法是 1)不包括该文件或 2)通过以下配置显式排除该规则:

    SecRuleRemoveById 999005
    

    但是你可能想要添加另一个规则,所以这仍然适用于 css 和 js 文件。

    而且,扫描传出机构的成本很高。通常传入的 HTTP 请求很小(除非您是上传站点),但传出的请求通常很大,因此默认情况下 SecResponseBodyAccess 是关闭的。你确定你要这么做吗?不确定您要实现什么,但可能有更好的方法来实现您的目标(例如使用内容安全策略)。

    【讨论】:

    • 谢谢,我试过了,但它并没有解决我的问题。我相应地编辑了答案。
    • 能否更新调试日志?我怀疑由于 CRS 规则(例如 modsecurity_crs_10_ignore_static.conf 中的规则)出于性能原因明确允许它们进入阶段 2(因此它们跳过阶段 3 和 4),因此不再为静态内容调用它。
    • 这听起来很可能,因为在将阶段更改为 4 后,规则的 id 没有出现在调试日志中。您能否更新您关于如何阻止这种情况发生的答案?我更新了我的问题。非常非常感谢。
    • 更新了我的答案
    • 我刚刚尝试禁用所有 OWASP CRS 规则,但该规则仍然出现在调试日志中,仅在第 1 阶段而不是在第 4 阶段。第 4 阶段似乎没有开始。我会更新我的问题。这是我的调试日志:pastebin.com/8aXk8hL0
    【解决方案2】:

    我花了几个晚上试图找出为什么这不起作用。

    原因是 ModSecurity 的技术限制。你可以在这里看到问题: https://github.com/SpiderLabs/ModSecurity/issues/1658

    如果您将mod_rewrite 与 apache 一起使用,则无法应用 phase:3 或 phase:4 规则,并且给定阶段的规则根本不会执行。

    【讨论】:

    • 我以为是这样,但我打开后:SecResponseBodyAccess On 就按要求工作了。
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多