Nginx + PHP-FPM 架構中,若配置不當且 PHP 開啟 cgi.fix_pathinfo=1,攻擊者可上傳夾帶惡意代碼的圖片 (如 shell.jpg),再請求 shell.jpg/xxx.php 導致 PHP 將圖片當作腳本執行,獲取伺服器控制權。本文詳解漏洞成因、攻擊向量與兩種修復方案。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name 傳遞腳本路徑。/upload/shell.jpg/xxx.php 時,$fastcgi_script_name = /upload/shell.jpg/xxx.php。cgi.fix_pathinfo=1 (預設開啟) 會嘗試修正路徑:認為 /upload/shell.jpg 為腳本,/xxx.php 為 PATH_INFO。shell.jpg,因檔案含 PHP 代碼 → 任意代碼執行。cgi.fix_pathinfo=1 且 Nginx 無路徑校驗的部署。; php.ini cgi.fix_pathinfo = 0
重啟 PHP-FPM 與 Nginx/IIS 即可生效。此設定禁止 PHP 修正路徑,強制要求完整腳本路徑存在才執行。
在 server 或 location ~ \.php$ 區塊加入:
if ($fastcgi_script_name ~ \..*\/.*php) {
return 403;
}
邏輯:匹配 xxx.jpg/xxx.php 此類路徑,直接回傳 403,不傳遞給 PHP-FPM。
修改後執行 nginx -t && systemctl reload nginx。
location /upload { location ~ \.php$ { deny all; } }open_basedir 限制跨目錄讀寫。修復漏洞只需一行配置,卻能阻斷最常見的 RCE 攻擊路徑,請立即檢查生產環境。