為 WordPress 強化 PHP
已發表: 2021-06-29WordPress 在 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 配置(很常見),您可以使用以下命令指定要使用的 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 安全漏洞,他們可以利用該漏洞,您最不希望他們能夠在您的服務器上運行任意代碼. 如果攻擊者能夠在您的服務器上運行任意代碼,他們可能會安裝 webshell 或建立反向 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 代碼。 這是相當有風險的——如果攻擊者能夠以某種方式利用插件或主題中的文件上傳漏洞,他們可能能夠上傳 webshell 或類似類型的後門。 由於在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 |
---|