Webshell(PHP 木馬)是伺服器被入侵後駐留、提權、橫向移動的核心工具。防禦核心在於事前限制攻擊面:限制 PHP 腳本可存取路徑、禁用高危函數、降低進程權限。本文整理生產環境可直接套用的三層防禦體系。
在 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 並失敗。
編輯 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)無法運作。建議採用「最小必要原則」:先全禁用,再按錯誤日誌逐一放行業務必需函數。
# 建立用戶(無登入 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
net user php_user StrongP@ssw0rd /addnet localgroup Users php_user /add(確保不在 Administrators)php_user 讀取/執行,上傳目錄給寫入。php_flag engine off (Apache) 或 location ~ \.php$ { deny all; } (Nginx) 禁止腳本執行。finfo_file() 檢測真實類型。expose_php = Off ; Nginx/Apache 亦隱藏 Server 版本 server_tokens off;
display_errors = Off log_errors = On error_log = /var/log/php/error.log error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
eval(、assert(、base64_decode( 等高危模式PHP 木馬防禦無銀彈,需構建「目錄限制 + 函數禁用 + 權限最小化 + 上傳防禦 + WAF + 持續監控」的纵深體系。open_basedir 與 disable_functions 是成本最低、效果最直接的兩道防線;配合最小權限原則運行服務,可將 Webshell 危害控制在單一站點、單一低權限用戶範圍內,極大降低入侵損失。