我拥有带有apache2
,libapache2-mod-security2
,modsecurity-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(很短)
答案 0 :(得分:0)
您的规则是第1阶段的规则,要查看响应主体,就必须是第4阶段的规则。
因此,阶段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规则,并且完全不会执行给定阶段中的规则。