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

PHP FastCGI 解析漏洞 (CVE-2019-11043 等) 原理與 Nginx/IIS 修復方案

     編輯:PHP 綜合知識

Nginx + PHP-FPM 架構中,若配置不當且 PHP 開啟 cgi.fix_pathinfo=1,攻擊者可上傳夾帶惡意代碼的圖片 (如 shell.jpg),再請求 shell.jpg/xxx.php 導致 PHP 將圖片當作腳本執行,獲取伺服器控制權。本文詳解漏洞成因、攻擊向量與兩種修復方案。

一、漏洞成因

  1. Nginx 以 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name 傳遞腳本路徑。
  2. 請求 /upload/shell.jpg/xxx.php 時,$fastcgi_script_name = /upload/shell.jpg/xxx.php。
  3. PHP 開啟 cgi.fix_pathinfo=1 (預設開啟) 會嘗試修正路徑:認為 /upload/shell.jpg 為腳本,/xxx.php 為 PATH_INFO。
  4. PHP 解析執行 shell.jpg,因檔案含 PHP 代碼 → 任意代碼執行。

二、危害等級

  • 嚴重:任意代碼執行 (RCE),攻擊者可獲取 Web 權限、反彈 Shell、竊取資料庫、橫向移動。
  • 影響範圍:所有啟用 cgi.fix_pathinfo=1 且 Nginx 無路徑校驗的部署。

三、修復方案一:修改 php.ini (推薦,通用 Nginx/IIS)

; php.ini
cgi.fix_pathinfo = 0

重啟 PHP-FPM 與 Nginx/IIS 即可生效。此設定禁止 PHP 修正路徑,強制要求完整腳本路徑存在才執行。

四、修復方案二:Nginx 層面攔截 (僅限 Nginx)

在 server 或 location ~ \.php$ 區塊加入:

if ($fastcgi_script_name ~ \..*\/.*php) {
    return 403;
}

邏輯:匹配 xxx.jpg/xxx.php 此類路徑,直接回傳 403,不傳遞給 PHP-FPM。

修改後執行 nginx -t && systemctl reload nginx。

五、深度防禦建議

  1. 上傳目錄禁用 PHP 解析:location /upload { location ~ \.php$ { deny all; } }
  2. 上傳檔案重命名為隨機名、去除副檔名、存放於非 Web 目錄。
  3. 檔案上傳驗證 MIME、副檔名、內容掃描 (ClamAV)。
  4. PHP-FPM 以低權限用戶運行,啟用 open_basedir 限制跨目錄讀寫。
  5. 定期掃描 Web 目錄異常 .php/.phtml 檔案。

修復漏洞只需一行配置,卻能阻斷最常見的 RCE 攻擊路徑,請立即檢查生產環境。

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