首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 木馬防禦實戰:目錄限制、函數禁用、權限最小化

     編輯:PHP 相關知識

前言

Webshell(PHP 木馬)是伺服器被入侵後駐留、提權、橫向移動的核心工具。防禦核心在於事前限制攻擊面:限制 PHP 腳本可存取路徑、禁用高危函數、降低進程權限。本文整理生產環境可直接套用的三層防禦體系。

第一層:防止跳出 Web 目錄(open_basedir)

在 Apache httpd.conf 或 PHP-FPM 池配置中設定 open_basedir,強制 PHP 僅能讀寫指定目錄樹:

# Apache httpd.conf 或 .htaccess
php_admin_value open_basedir "/var/www/html:/tmp:/usr/share/php"

# PHP-FPM pool.d/www.conf
php_admin_value[open_basedir] = /var/www/html:/tmp:/usr/share/php

效果:嘗試 fopen('/etc/passwd')、include('../../../etc/passwd') 將拋出 Warning: open_basedir restriction in effect 並失敗。

第二層:禁用高危函數(disable_functions)

編輯 php.ini,將可執行系統指令、操作檔案系統的函數加入黑名單:

; 核心執行類
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec

; 檔案系統操作類(視業務需求酌情保留)
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec, \
    fopen,fread,fwrite,fclose,file_get_contents,file_put_contents, \
    mkdir,rmdir,chmod,chown,unlink,rename,copy,link,symlink, \
    opendir,readdir,scandir,glob,realpath, \
    file_exists,is_dir,is_file,filesize,filemtime, \
    parse_ini_file,highlight_file,show_source

; 資訊洩露類
disable_functions = ...,phpinfo,ini_get_all,get_defined_vars,get_defined_functions

注意:過度禁用會導致正常框架(Laravel、ThinkPHP、Composer)無法運作。建議採用「最小必要原則」:先全禁用,再按錯誤日誌逐一放行業務必需函數。

第三層:進程權限最小化(Linux/Windows)

Linux:建立專用低權限用戶運行 PHP-FPM

# 建立用戶(無登入 Shell、無家目錄)
useradd -r -s /sbin/nologin -M php-fpm

# 設定網站目錄擁有者與權限
chown -R php-fpm:php-fpm /var/www/html
find /var/www/html -type d -exec chmod 750 {} \;
find /var/www/html -type f -exec chmod 640 {} \;

# 僅允許寫入的目錄(上傳、快取、日誌)給寫權限
chmod 770 /var/www/html/storage /var/www/html/bootstrap/cache
chown -R php-fpm:php-fpm /var/www/html/storage /var/www/html/bootstrap/cache

# PHP-FPM 池配置指定用戶
; /etc/php-fpm.d/www.conf
user = php-fpm
group = php-fpm

Windows:降低 Apache/IIS 服務權限

  1. 建立標準用戶(非 Administrators 群組):
    net user php_user StrongP@ssw0rd /add
    net localgroup Users php_user /add(確保不在 Administrators)
  2. 開啟「服務」 → Apache/IIS → 內容 → 登入 → 選擇「此帳戶」 → 輸入帳號密碼 → 重啟服務。
  3. 設定網站目錄 NTFS 權限:僅給 php_user 讀取/執行,上傳目錄給寫入。

纵深防禦補充措施

1. 檔案上傳防禦

  • 上傳目錄設定 php_flag engine off (Apache) 或 location ~ \.php$ { deny all; } (Nginx) 禁止腳本執行。
  • 檔案重命名為隨機名 + 無副檔名,資料庫記錄原始名稱。
  • 驗證 MIME 與副檔名,使用 finfo_file() 檢測真實類型。

2. 禁用 PHP 版本暴露

expose_php = Off
; Nginx/Apache 亦隱藏 Server 版本
server_tokens off;

3. 關閉錯誤顯示,開啟錯誤日誌

display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

4. 使用 Web 應用防火牆 (WAF)

  • ModSecurity + OWASP CRS 規則集
  • 商業 WAF(云鎖、安全狗、阿里云盾)
  • 自訂規則攔截 eval(、assert(、base64_decode( 等高危模式

5. 定期掃描與應急響應

  • 部署 PHPMalwareScanner、Linux Malware Detect (LMD) 定期掃描 Web 目錄。
  • 建立檔案完整性基線(AIDE、Tripwire),異常變更即時告警。
  • 制定 Webshell 應急響應流程:隔離主機 → 保留證據 → 掃描清理 → 根因分析 → 加固防禦。

總結

PHP 木馬防禦無銀彈,需構建「目錄限制 + 函數禁用 + 權限最小化 + 上傳防禦 + WAF + 持續監控」的纵深體系。open_basedir 與 disable_functions 是成本最低、效果最直接的兩道防線;配合最小權限原則運行服務,可將 Webshell 危害控制在單一站點、單一低權限用戶範圍內,極大降低入侵損失。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved