我在各种网站上使用 mod_security,有些是 WordPress,有些不是。
我注意到在非 WordPress 网站上有以下内容:
https://test-site.com/?exec=/bin/bash
返回 403 禁止错误代码,以及 Apache“禁止”错误页面。mod_security 错误被写入日志。
然而,奇怪的是,在 WordPress 安装中出现了以下情况:
https://wordpress-test-site.com/?exec=/bin/bash
返回 403 禁止错误代码并将错误写入日志,但是它显示主页的内容,而不是 Apache“禁止”错误页面。
我注意到它在除主页之外的任何其他页面上均正常运行:
https://wordpress-test-site.com/some-page/?exec=/bin/bash
上述操作按预期工作,并返回 Apache 错误页面。
我只能假设这与 WordPress 的 mod_rewrite 规则存在冲突,如下所示:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
我是不是漏掉了什么?当通过主页匹配 mod_security 规则时,我不想显示主页内容。
答案1
感谢评论中的@MrWhite,在 Centos 上我发现了一个名为的文件,/etc/httpd/conf.d/welcome.conf
其中包含:
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
由于没有名为.noindex.html
403 错误文档本身的文件,因此触发了内部 404 错误。
注释掉上面的几行解决了这个问题。
答案2
我只能假设这与 WordPress 的 mod_rewrite 规则存在冲突
它实际上看起来像对面的正在发生。只有当您请求时https://wordpress-test-site.com/<something>
,mod_rewrite 指令才会真正起作用。当您请求文档根目录时,mod_rewrite 指令根本不匹配,而是将请求重写为index.php
mod_dir 作为内部子请求(DirectoryIndex
文件)。
DirectoryIndex
但是,假设您有一份文档,我希望非 WordPress 测试站点也会出现同样的行为?!
话虽如此,我是否希望 mod_security 规则在这里优先考虑?
为了验证这个理论,你可以尝试将你的 WordPress 更改.htaccess
为以下内容:(我假设你正在使用,.htaccess
因为发布的 mod_rewrite 指令旨在用于目录语境。)
DirectoryIndex disabled
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.php [L]
</IfModule>
更新:请注意与原始指令相比的 2 处变化。RewriteRule
图案现在是^
,不是,.
并且RewriteCond
检查请求是否映射到目录的指令被注释掉了。
这会强制对文档根目录的请求也由 mod_rewrite 指令处理(效率略低)。由于我们已经注释掉了目录文件系统检查,这意味着目录将无法访问(尽管这很少是必需的)。