启用 modsecurity crs sql 注入时禁止提交表单

启用 modsecurity crs sql 注入时禁止提交表单

我的网站使用 Ubuntu 16、Apache 2.4、php 5.6,并且我使用 CMS Drupal 8

我安装了模块 mod_security。我激活了它,然后启用了modsecurity_crs_41_sql_injection_attacks.conf

对于每个表单,当我提交时,都会出现错误 403 禁止

你能解释一下为什么所有提交表格都被禁止吗

编辑:添加 Apache 错误日志

[Wed Nov 15 16:53:03.324516 2017] [:error] [pid 27760] [client] ModSecurity: Access denied with code 403 (phase 2). 
 Pattern match "([\\\\~\\\\!\\\\@\\\\#\\\\$\\\\%\\\\^\\\\&\\\\*\\\\(\\\\)\\\\-\\\\+\\\\=\\\\{\\\\}\\\\[\\\\]\\\\|\\\\:\\\\;\\"\\\\'\\\\\\xc2\\xb4\\\\\\xe2\\x80\\x99\\\\\\xe2\\x80\\x98\\\\`\\\\<\\\\>].*?){4,}" 
 at ARGS_NAMES:field_cl_address[0][format]. 
 [file "/usr/share/modsecurity-crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] 
 [line "159"] [id "981173"] [rev "2"] 
 [msg "Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded"] 
 [data "Matched Data: ] found within ARGS_NAMES:field_cl_address[0][format]: field_cl_address[0][format]"] 
 [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [hostname "www.d8.dev.xxxx"] [uri "/node/add/occlient/19784"] [unique_id "Wgxw738AAQEAAGxw91sAAAAO"]

答案1

好吧,让我们分解一下。

规则 981173 是导致问题的规则。它被标记是因为

“受限 SQL 字符异常检测警报 - 特殊字符总数超出”

它甚至会告诉你存在问题的领域:

[data“在 ARGS_NAMES:field_cl_address[0][format]:field_cl_address[0][format] 中找到匹配的数据:]”]

此规则的运行方式是在每个字段上运行一个非常长的正则表达式,并检查是否存在 4 个或更多特殊字符(包括 [ 和 ])。包含大量特殊字符的字段可能表明有人试图通过混淆不良负载或转义字符来绕过服务器或软件可能执行的基本检查。

但是对于您来说,您的字段名称包含 2 个 [ 字符和 2 个 ] 字符,这等于 4 个特殊字符的限制,因此每个请求都会被阻止。就目前而言,这条规则对您保护该表单毫无用处。

OWASP 通用规则集 (CRS) 是一组建议规则,它并不适合每个站点,并且在以阻止模式打开它们之前需要进行调整。

在 CRS 版本 3 中,规则 981173 被重新编号为规则 942430(这些规则在迁移到版本 3 的过程中被重新编号,原因我就不多说了),并且他们将必须匹配的特殊字符数从 4 个增加到了 12 个,以避免出现此类误报。说实话,如果您是第一次安装 CRS,那么您应该先迁移到版本 3,因为他们做了很多工作,使其更易于安装并避免出现此类误报。

如果您暂时想继续使用 2.9 版本,那么您的选择是:

  1. 通过包含以下配置来停止使用此规则:

    SecRuleRemoveById 981173

  2. 通过包含以下配置来停止检查该特定字段:

    SecRuleUpdateTargetById 959071 !ARG_NAMES:'field_cl_address[0][format]'

  3. 手动编辑规则以将其更改为{4,}{12,}因此您需要更多匹配才能触发此规则。通常不建议直接编辑规则,而是最好有一个覆盖配置文件,并使用它来更改规则 - 就像前两个示例一样。不幸的是,没有办法更改规则 ID 正则表达式,因此手动编辑是唯一的选择(或打开该规则,然后使用覆盖配置中的调整将其复制到新规则)。

乍一看,关闭规则似乎有些奇怪,但这正是 ModSecurity 中规则集微调的含义 - 关闭对您无用的规则,或调整它们以使其不在某些已知字段上触发。这会降低 ModSecurity 和 CRS 提供的安全性吗?是的,会降低一点,但一个完全安全却无法正常工作的站点并没有那么有用,除了最简单的站点之外,所有站点都需要对 CRS(尤其是 SQL 注入规则)进行一些修改。

规则 981173 是我通常会完全关闭的规则,因为它很容易出现误报。不久前,我写了一篇关于我为阻止 CRS 2.9 过度阻止而进行的其他常见调整的文章: https://stackoverflow.com/questions/33989273/modsecurity-excessive-false-positives#answer-34027786

最后,我真的推荐《ModSecurity 手册》(最近更新至第二版),以便详细了解这一切如何运作:https://www.feistyduck.com/books/modsecurity-handbook/

答案2

谢谢@BazzaDP

我按照你的建议操作,并且运行良好。

另外,我删除了一些其他规则 ID

<IfModule security2_module>
                        SecRuleRemoveById 973300
                        SecRuleRemoveById 981245
                        SecRuleRemoveById 981248
                        SecRuleRemoveById 981173
                        SecRuleRemoveById 981231
                        SecRuleRemoveById 950901
                        SecRuleRemoveById 981260
                </IfModule>

相关内容