ModSecurity SecRule RESPONSE_BODY不起作用

时间:2019-05-02 18:58:47

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

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

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

/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中包含<script>的每个页面,但是不会,尽管响应中<script>标签为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(很短)

2 个答案:

答案 0 :(得分:0)

您的规则是第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默认是关闭的。你确定要这么做吗?不确定您要实现的目标,但可能有更好的方法来实现目标(例如,使用内容安全政策)。

答案 1 :(得分:0)

我花了整夜的时间试图找出为什么这没用。

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

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