PHP 內建多種可執行系統指令、操作檔案系統、修改執行環境的函數。若伺服器遭駭或程式碼注入,攻擊者可利用這些函數執行任意指令、竊取檔案、提權、植入後門。在 php.ini 設定 disable_functions 是最基礎的防禦縱深措施。
| 函數 | 功能 | 風險等級 | 備註 |
|---|---|---|---|
exec | 執行外部程式 | 高 | 最常被濫用的指令執行入口 |
shell_exec | 透過 Shell 執行指令並回傳字串 | 高 | 反引號 `cmd` 同義 |
system | 執行外部程式並輸出 | 高 | |
passthru | 執行外部程式並直接輸出原始資料 | 高 | |
proc_open | 執行指令並開啟管道讀寫 | 高 | 可雙向互動,更危險 |
proc_get_status | 取得 proc_open 開啟程序資訊 | 高 | |
popen | 開啟程序管道 | 高 | |
pcntl_exec | 執行程式替換當前進程 | 高 | 需 pcntl 擴充 |
chroot | 改變根目錄 | 高 | 僅 CLI、非 Windows |
chgrp / chown | 改變檔案群組/擁有者 | 高 | 配合檔案上傳可竊取權限 |
symlink | 建立符號連結 | 高 | 可跳出 open_basedir |
dl | 動態載入 PHP 擴充模組 | 高 | 已移除於 PHP 7+,舊版必禁 |
ini_set / ini_alter / ini_restore | 修改/還原 PHP 設定 | 高 | 可關閉 safe_mode、開啟危險函數 |
putenv | 設定環境變數 | 高 | 舊版可繞過 safe_mode 執行指令 |
error_log | 寫入錯誤日誌 | 低 | 特定版本可繞過 safe_mode |
phpinfo | 輸出 PHP 環境資訊 | 中 | 洩露伺服器配置細節 |
scandir | 列出目錄檔案 | 中 | 資訊洩露,配合 LFI 危險 |
readlink | 讀取符號連結目標 | 中 | |
syslog | 呼叫系統 syslog | 中 | |
pfsockopen / fsockopen / stream_socket_server | 建立 Socket 連線 | 高/中 | 可掃描內網、發起攻擊 |
; php.ini
disable_functions = exec,shell_exec,system,passthru,proc_open,proc_get_status,popen,pcntl_exec,chroot,chgrp,chown,symlink,dl,ini_set,ini_alter,ini_restore,putenv,phpinfo,scandir,readlink,syslog,pfsockopen,fsockopen,stream_socket_server
說明:
exec 用於匯出報表),請評估風險、限制參數、改用非阻塞佇列或獨立 Worker 機制,切勿直接開放。dl、ini_alter 等,設定時會被忽略,無害。<?php
var_dump(function_exists('exec')); // bool(false)
var_dump(ini_get('disable_functions'));
disable_classes 可禁用 COM、DOTNET 等。