WordPress网站上适用于ModSecurity的Apache LocationMatch通配符

dan*_*gel 3 regex apache wordpress 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>
Run Code Online (Sandbox Code Playgroud)

我想要的是将所有内容合并为在wp-admin和上使用通配符的单个规则wp-login

我已经尝试了以下方法,但由于mod_security引发了拒绝,因此它似乎被忽略了。

<LocationMatch "(/wp-admin/*|/wp-login/*)">
....
Run Code Online (Sandbox Code Playgroud)

并且

<LocationMatch "(/wp-admin/*)">
....
Run Code Online (Sandbox Code Playgroud)

并且

<Location "/wp-admin/*">
....
Run Code Online (Sandbox Code Playgroud)

我已经对LocationMatch和regex进行了一些研究,但这里没有得到任何东西。我想要做什么?

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

Bar*_*ard 5

尽管Carsten的答案是正确的,但应注意,Location和Location指令第1阶段ModSecurity规则。但是,您的规则似乎都处于第2阶段,因此,在这种情况下,这并不是特别重要-尽管我没有访问规则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.
Run Code Online (Sandbox Code Playgroud)

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

另一个值得记住的有趣的事情是,如果您使用SecRuleRemoveById,则需要要删除的规则之后指定它;而如果您使用ctl:ruleRemoveById,则需要要删除的规则之前指定它。

但是,大多数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>
Run Code Online (Sandbox Code Playgroud)

或其他格式:

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
Run Code Online (Sandbox Code Playgroud)

是的,这可能意味着额外的工作,我知道您来此是为了合并您的规则以简化此工作,但是如果最终禁用了许多旨在保护的规则,则运行像ModSecurity这样的WAF毫无意义与之相反,不幸的是,Wordpress成为许多坏人的积极目标,部分原因是其受欢迎程度。

因此,虽然我没有直接回答您的问题,但我希望它能对您有所帮助,并为您提供思考的机会。

  • 虽然 Carsten 直接回答了最初的问题......这篇文章肯定有很多有用的信息,我当然感谢你花时间写它。 (2认同)