WordPress网站上的ModSecurity的Apache LocationMatch通配符

时间:2015-08-17 01:09:28

标签: regex wordpress apache mod-security

我在运行WordPress网站的Ubuntu 14.04 Apache 2.4.7上安装了mod_security。我有一些我需要忽略的规则,但是我在实施一些通配符规则时遇到了麻烦,因此我不必指定每一页......

我拥有的(在我的site.conf文件中)是......

  <LocationMatch "/wp-admin/post.php">
     SecRuleRemoveById 300016
  </LocationMatch>

  <LocationMatch "/wp-admin/nav-menus.php">
     SecRuleRemoveById 300016
  </LocationMatch>

  <LocationMatch "(/wp-admin/|/wp-login.php)">
     SecRuleRemoveById 950117
     SecRuleRemoveById 950005
     SecRuleRemovebyID 981173
     SecRuleRemovebyId 960024
  </LocationMatch>

    <LocationMatch "/wp-admin/load-scripts.php">
     SecRuleRemoveById 981173
    </LocationMatch>


    <LocationMatch "/wp-admin/plugins.php">
     SecRuleRemoveById 981173
    </LocationMatch>

    <LocationMatch "/wp-admin/customize.php">
     SecRuleRemoveById 981173
    </LocationMatch>

我想要的是将所有内容合并到一个使用wp-adminwp-login上的通配符的规则中。

我尝试了以下内容,但似乎被忽略了,因为mod_security正在拒绝..

<LocationMatch "(/wp-admin/*|/wp-login/*)">
....

以及

<LocationMatch "(/wp-admin/*)">
....

以及

<Location "/wp-admin/*">
....

我已经对LocationMatch和regex做了一些研究,但我没有在这里得到一些东西。我正在减少做什么?

编辑: modsec_audit.log中的引荐来源网址为http://www.<site>.com/wp-admin/customize.php?theme=modality

2 个答案:

答案 0 :(得分:3)

虽然Carsten的回答是正确的,但应该注意位置和位置指令在第1阶段ModSecurity规则之后运行。然而,看起来你的规则无论如何都是第二阶段,所以在这种情况下这并不特别重要 - 尽管我无法访问规则300016,因此无法100%确定。

无论如何,出于这个原因,我不喜欢使用Location和LocationMatch,并且个人更喜欢在ModSecurity中使用新规则进行位置过滤:

SecRule REQUEST_URI "@beginsWith /wp-(admin|login)/" \
   "phase:2,id:1000,nolog,pass,ctl:ruleRemoveById=300016,\
   ctl:ruleRemoveById=950117,\
   ctl:ruleRemoveById=950005
   ...etc.

这样我可以在规则过滤中保持一致(而不是使用上面的规则过滤第1阶段规则,以及通过位置匹配过滤的其他规则)。但是,每个阶段都需要一个规则。无论如何,正如我所说,如果所有这些都是目前的第2阶段或更高规则,那并不重要。

另一个有趣值得记住的是,如果您使用SecRuleRemoveById,则需要在> 之后指定要移除的规则,而如果使用ctl:ruleRemoveById,则需要在之前指定 / strong>你要删除的规则。

然而,大多数Wordpress攻击都会针对这些URL。因此,您希望非常确保您不需要这些规则。通过转向更通用的例外情况,您可以将每个规则与超出需要的规则进行匹配。例如,如果从您的原始设置看起来如此,/ wp-login.php只需要其中4个例外,但您将移动它们全部。

我建议不要放松规则以匹配更多规则,而应该让它们保持紧密,进行此更改。

实际上你可以进一步收紧它们,只匹配导致需要异常的某些参数。例如,如果只有用户名字段导致您出现问题,那么您可以收紧规则:

<LocationMatch "(/wp-admin/|/wp-login.php)">
     SecRuleUpdateTargetById 950117 !ARGS:'username'
     SecRuleUpdateTargetById 950005 !ARGS:'username'
     SecRuleUpdateTargetById 981173 !ARGS:'username'
     SecRuleUpdateTargetById 960024 !ARGS:'username'
</LocationMatch>

或其他格式:

SecRule REQUEST_URI "@beginsWith /wp-(admin|login)/" \
  "phase:2,id:1000,nolog,pass,\
  ctl:ruleRemoveTargetById=950117;ARGS:username,\
  ctl:ruleRemoveTargetById=950005;ARGS:username,\
  ctl:ruleRemoveTargetById=981173;ARGS:username,\
  ctl:ruleRemoveTargetById=960024;ARGS:username

是的,这可能意味着额外的工作,而且我知道你来到这里是为了巩固你的规则以使这个更容易,但是如果你最终禁用了很多规则,那么运行类似ModSecurity的WAF就没什么意义了。旨在防止和不幸的是,Wordpress是许多坏人的积极目标,部分原因在于它的受欢迎程度。

所以,虽然我没有直接回答你的问题,但我希望它有用,让你有所思考。

答案 1 :(得分:2)

这应该有效:

<LocationMatch "/wp-(admin|login)/">

这里不需要通配符,因为你只想检测路径的开头而且无关紧要,第二次斜线之后会出现什么。

对于Location,您需要~来触发正则表达式解释:

<Location ~ "/wp-(admin|login)/">

更多详情: