【问题标题】:Modsecurity CSRF alert when using $_GET使用 $_GET 时的 Modsecurity CSRF 警报
【发布时间】:2017-09-12 20:12:33
【问题描述】:

当客户访问我的个人服务器上托管的 PHP 站点时,他在 URL 中包含一个变量(例如 https://www.example.com/test.php?t=somevalue),modsecurity 会在 error.log 文件中显示一条错误消息。

规格:

Server OS:   Linux server 3.2.0-4-486 #1 Debian 3.2.57-3 i686
Apache:      version 2.2.22
PHP:         version 5.4.4-14+deb7u9
Modsecurity: version 2.8.0

错误信息:

ModSecurity: Warning. Match of "eq 1" against "&ARGS:CSRF_TOKEN" required. [file "/usr/share/modsecurity-crs/optional_rules/modsecurity_crs_43_csrf_protection.conf"] [line "31"] [id "981143"] [msg "CSRF Attack Detected - Missing CSRF Token."]

This SO 问题与我的类似,除了我只在客户端的浏览器添加变量时收到错误。

Modsecurity 使用OWASP base_rulesoptional_rules 进行配置。我不为这些使用符号链接。

我的服务器配置唯一不寻常的是它使用自签名 SSL 证书,但我认为这与问题无关。

无论 PHP 文件包含什么内容都会显示该错误,而 HTML 文件不会出现此错误。

是什么导致了这个错误,我该如何消除它?

如果是缺少 CSRF 令牌,我该如何添加?

【问题讨论】:

  • 你在 /etc/modsecurity/rules/ 下有什么?
  • OWASP base_rulesoptional_rules。我将其添加到我的问题中......
  • modsecurity_crs_43_csrf_protection.conf的内容是什么
  • AW,我建议不要使用 csrf 保护规则并实施你自己的。因为它对ajax有限制。限制 - 此实现目前不适用于 AJAX
  • 您不需要非常有经验就可以从错误信息中读取行号:[line "31"] - 文件也被命名。使用该行和其中的给定规则,请查阅 mod_security 的文档,以及有关它的 OWASP 项目/文档(如果有)。我猜有人想出了一些东西来在其中插入规则,您可能会通过了解它而受益最大。

标签: php apache csrf mod-security


【解决方案1】:

对不起,说的很明显:

是什么导致了这个错误,我该如何消除它?

错误是由上述规则引起的。您可以通过提供 CSRF 令牌或禁用该规则来消除它。

【讨论】:

  • 即使陈述显而易见,也只需要 +1。 :)
  • 规则是使用modsecurity_crs_16_session_hijacking.conf 文件来防止CSRF 攻击,如果我是正确的话...所以$_GET 变量的问题是别的...对吗?
  • 像你说的那样删除第 31 行会导致 modsecurity 在 CSRF 保护中毫无价值吗?
  • @hakre 我如何provide the CSRF token
  • @HelpingHand:通过 SESSION 集合,SecRule 中的 append 操作将其移入(如果我看到和你一样的代码)。请参阅secure.jwall.org/blog/2009/01/08/1231374852674.html 如何链接来自 PHP(和其他语言)的会话数据。
【解决方案2】:

既然你提到这是你的个人服务器,我猜它不是托管业务关键应用程序。因此,我假设您并不担心跨站请求伪造。

如果这是真的,您可以简单地不在您的 Apache 配置文件中包含(引入)配置文件“modsecurity_crs_43_csrf_protection.conf”。

【讨论】:

    【解决方案3】:

    规则(modsecurity_crs_43_csrf_protection.conf 中的 id 981143)是一个链式规则。首先它检查请求是否有任何 ARGUMENTS(你在获取 url 中的 t 参数),然后检查请求的 CSRF 值是否匹配。

    由于我的应用程序的敏感数据始终在 POST 中传递,因此我更改了规则,使其仅考虑 POST 请求

    在上述文件更改中:

    SecRule &ARGS "@ge 1" "chain,phase:2,id:'981143'

    到:

    SecRule &ARGS_POST "@ge 1" "chain,phase:2,id:'981143'

    或作为自定义规则重新创建以避免丢失这些更新更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多