为 WordPress 强化 PHP

已发表: 2021-06-29

WordPress 在 PHP 上运行,是加固 WordPress 网站时需要注意的核心组件。 本文将介绍 WordPress 的 PHP 安全性时您可以解决的一些最常见、最容易实现的目标。

注意——更改 PHP设置时要小心。 不正确的设置和语法可能会损坏您的网站。 在生产中进行更改之前,请始终在开发或暂存环境中测试您的更改。

目录

  • 使用最新的 PHP 版本
  • 抑制PHP版本
  • 删除任何 phpinfo() 文件
  • 抑制 PHP 错误和警告
  • 限制包括
  • 禁用远程文件包括
  • 禁用或限制危险功能
  • 在敏感目录中阻止 PHP 执行
  • 结论

使用最新的 PHP 版本

除了确保您正在修补您的操作系统、MySQL 服务器、Web 服务器(例如 Nginx、Apache、IIS ......)之外,确保您运行的是完全受支持的 PHP 1版本也非常重要.

由于 PHP 暴露在 Internet 上(因为 WordPress 运行在 PHP 解释器之上),如果发现 PHP 中的漏洞利用,则面临更大的攻击风险。 在这种情况下,使 PHP 保持最新(更重要的是,远离生命周期结束的 5.x PHP 版本)不仅对于防止攻击发生至关重要,而且对于允许攻击者升级攻击也至关重要,如果他们设法在您的 WordPress 网站中站稳脚跟(例如,通过利用 WordPress 插件中的漏洞)。

抑制PHP版本

与大多数 Web 服务器软件一样,默认情况下,PHP 通过 X-Powered-By HTTP 标头公开其运行的版本。 虽然这本身并不是一个安全漏洞,但与任何其他情况一样,枚举软件版本通常对攻击者在攻击的侦察阶段很有用。 因此,通过禁用 PHP 版本,您将使攻击更难成功。

幸运的是,使用expose_php 设置很容易禁用它。 在您的php.ini配置文件中,只需添加以下内容。

expose_php = Off

删除任何 phpinfo() 文件

使用 phpinfo() 函数创建 PHP 文件以用于调试是许多 PHP 系统管理员的常见坏习惯。 如果攻击者遇到“phpinfo”文件(通常,不出所料地命名为 phpinfo.php),他们将获得大量信息和详细信息,不仅包括服务器上运行的 PHP 版本,还包括网站的其他方面,例如作为网络和数据库服务器。

如果您确实需要运行 phpinfo(),最好从命令行执行,如下所示。

php -i

如果您的系统上有多个 PHP 配置(很常见),您可以使用以下命令指定要使用的 php.ini 文件。

php -c /etc/php/apache2/php.ini -i

抑制 PHP 错误和警告

虽然错误、警告和异常在开发过程中很有帮助,但如果显示在面向公众的环境中,攻击者通常会使用这些信息来深入了解服务器配置、应用程序布局和组件。

错误消息是一些最常见的信息泄露途径,通常会泄露应用程序安装路径和数据库连接详细信息等信息。 确保记录此信息,而不是显示错误和警告。 有关此主题的更多信息可以在官方 PHP 文档中找到。

幸运的是,这很容易使用 display_errors 设置禁用。 在您的 php.ini 配置文件中,只需添加以下内容。

display_errors = Off
log_errors = On

限制包括

文件包含漏洞允许攻击者控制 PHP include() 语句。 虽然 PHP 将在包含的文件中执行任何 PHP 代码,但它会打印出其他任何内容(假设它是纯文本)。 这意味着控制文件包含漏洞的攻击者最终可能会运行类似于以下内容的内容,从而使他们能够访问敏感的系统文件。 要了解有关文件包含的更多信息,请查看本文。

include "../../../../etc/passwd"

通过在 php.ini 中设置 open_basedir 设置,您可以指示 PHP 只允许包含在某个目录及以下目录中。 虽然这并不能消除文件包含漏洞,但肯定会使它们受到更多限制,并且还会阻止一些可能导致代码执行的更高级的攻击(当攻击者可以在您的服务器上执行命令时)。

您可以在 php.ini 文件中按如下方式设置 open_basedir PHP 设置。

open_basedir = /var/www/html/example.com

禁用远程文件包括

除了使用 open_basedir 将本地包含限制到特定目录之外,还建议禁用远程包含。 远程文件包含 (RFI) 攻击的工作方式与本地文件包含攻击类似,但攻击者不会被绑定到系统上的文件,远程文件包含允许攻击者通过网络包含文件。 这是极其危险的,大多数 RFI 攻击最终导致攻击者能够在您的 Web 服务器上任意执行代码(称为远程代码执行,或 RCE)。

要禁用远程文件包含,请在 php.ini 文件中使用 allow_url_fopen 和 allow_url_include PHP 选项,如下所示。

allow_url_fopen = Off
allow_url_include = Off

禁用或限制危险功能

如果攻击者不顾您采取了所有安全措施,成功地找到了您的 WordPress 的 PHP 安全漏洞,他们可以利用该漏洞,您最不希望他们能够在您的服务器上运行任意代码. 如果攻击者能够在您的服务器上运行任意代码,他们可能会安装 webshel​​l 或建立反向 shell 以进一步控制您的服务器并使用它进行恶意竞标(例如传播恶意软件、使用您的网站进行网络钓鱼活动或拒绝服务攻击,甚至挖掘加密货币)。

通过禁用 shell_exec() 和 system() 等函数,您可以防止用户和攻击者使用这些危险函数。 虽然使用这些功能可能有正当的理由,但它们很少而且介于两者之间,并且通常有更安全的方法来实现相同的结果。

注意——在生产环境中运行之前,在测试或登台环境中彻底测试以下内容,因为您正在运行的某些软件/插件可能(希望是合法的)依赖于这些功能。

以下是您可能希望使用 php.ini 文件中的 disable_functions 设置在 PHP 中禁用的潜在危险函数的集合。

disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace,
tmpfile, link, ignore_user_abord, shell_exec, dl, exec, system, highlight_file, source,
show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid,
posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid,
posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, 
posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, 
posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, 
proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo</em>

在敏感目录中阻止 PHP 执行

默认情况下,您的wp-content/uploads目录(用于将主题、插件、图像、视频和其他文件上传到您的网站)被允许执行 PHP 代码。 这是相当有风险的——如果攻击者能够以某种方式利用插件或主题中的文件上传漏洞,他们可能能够上传 webshel​​l 或类似类型的后门。 由于在wp-content/uploads目录中允许 PHP 执行,攻击者可能能够实际执行该 PHP 代码来进行恶意竞标。

防止这种情况实际上很简单——在wp-content/uploads和目录中禁用 PHP 执行。 天真的方法是像这样使用.htaccess来简单地阻止对*.php文件的访问。

<Files *.php>
deny from all
</Files>

然而,上述配置相对容易绕过——在大多数情况下,PHP 会很乐意执行 .phtml .php3 文件。 最安全的方法是从字面上禁用目录中的 PHP 引擎。 以下.htaccess配置应放在 wp-content/uploads 和 wp-includes(攻击者通常针对的另一个目录)目录中。

php_flag engine off

WordPress 的 PHP 安全性——最后的想法

虽然 WordPress 本身被认为是一个强大且安全的平台,但运行 WordPress 的环境和基础设施对于确保整个网站的安全性大有帮助。 实施本 PHP 安全强化指南中涵盖的主题,将为您提供第二道防线,使攻击者在滥用您的 WordPress 网站中的漏洞后升级攻击变得更加困难。

如果您想了解有关如何强化 WordPress 网站的更多信息,请阅读我们关于 WordPress 安全和强化的权威指南。

本文中使用的参考文献[ + ]

本文使用的参考资料
1 https://www.php.net/supported-versions.php