PHP-CGI遠端程式碼執行漏洞(CVE-2012-1823)

Junglezt發表於2024-04-06

影響版本: php < 5.3.12 or php < 5.4.2

cgi、fastcgi、fpm

下載PHP原始碼,可以看到其中有個目錄叫sapi。sapi在PHP中的作用,類似於一個訊息的“傳遞者”

最常見的sapi應該是用於Apache的mod_php,這個sapi用於php和apache之間的資料交換

php-cgi也是一個sapi。在遠古的時候,web應用的執行方式很簡單,web容器接收到http資料包後,拿到使用者請求的檔案(cgi指令碼),並fork出一個子程序(直譯器)去執行這個檔案,然後拿到執行結果,直接返回給使用者,同時這個直譯器子程序也就結束了。基於bash、perl等語言的web應用多半都是以這種方式來執行,這種執行方式一般就被稱為cgi,在安裝Apache的時候預設有一個cgi-bin目錄,最早就是放置這些cgi指令碼用的。

但cgi模式有個致命的缺點,眾所周知,程序的建立和排程都是有一定消耗的,而且程序的數量也不是無限的。所以,基於cgi模式執行的網站通常不能同時接受大量請求,否則每個請求生成一個子程序,就有可能把伺服器擠爆。於是後來就有了fastcgi,fastcgi程序可以將自己一直執行在後臺,並透過fastcgi協議接受資料包,執行後返回結果,但自身並不退出。

php有一個叫php-cgi的sapi,php-cgi有兩個功能,一是提供cgi方式的互動,二是提供fastcgi方式的互動。也就說,我們可以像perl一樣,讓web容器直接fork一個php-cgi程序執行某指令碼;也可以在後臺執行php-cgi -b 127.0.0.1:9000(php-cgi作為fastcgi的管理器),並讓web容器用fastcgi協議和9000互動。

為什麼php有兩個fastcgi管理器?php確實有兩個fastcgi管理器,php-cgi可以以fastcgi模式執行,fpm也是以fastcgi模式執行。但fpm是php在5.3版本以後引入的,是一個更高效的fastcgi管理器

簡單理解PHP擁有兩個sapicgifastcgi,其中fpm就是fastcgi下的一種執行方式,是一個更高效的fastcgi執行管理方式

漏洞原理

CVE-2012-1823就是php-cgi這個sapi出現的漏洞,上面介紹了php-cgi提供的兩種執行方式:cgi和fastcgi,本漏洞只出現在以cgi模式執行的php中。

這個漏洞簡單來說,就是使用者請求的querystring被作為了php-cgi的引數,最終導致了一系列結果

漏洞利用

發現cgi模式下有如下一些引數可用:

  • -c 指定php.ini檔案的位置
  • -n 不要載入php.ini檔案
  • -d 指定配置項
  • -b 啟動fastcgi程序
  • -s 顯示檔案原始碼
  • -T 執行指定次該檔案
  • -h和-? 顯示幫助
  1. 這裡我們先啟動vulhub的靶機環境
cd /vulhub/php/CVE-2012-1823
sudo docker-compose up -d


  1. 最簡單的利用方式,當然就是-s,可以直接顯示原始碼:

  2. 一個更好的利用方法:透過使用-d指定auto_prepend_file來製造任意檔案包含漏洞,執行任意程式碼:

-d allow_url_include=on -d auto_prepend_file=php://input

使用-d引數可以配合php.ini中的配置檔案

  • allow_url_include: 允許包含遠端機器的檔案
  • auto_prepend_file: 頁面頂部載入的內容
  • auto_append_file: 頁面底部載入的內容
  • php://input: 透過POST方式提交資料,這裡運用的很巧妙,使用post方式提交需要包含的PHP程式碼


成功利用
其他的操作,例如命令執行

這裡也可以直接執行PHP程式碼,後續可以很多操作,例如如下思路

  • 透過shell_execsystem()或者其他命令執行函式命令執行
  • 透過命令執行執行wget下載本機的reverse.php
  • 使用PHP程式碼生成一句話木馬

透過/proc/self/environ本地檔案包含

修改User-Agent為PHP程式碼,檢視HTTP_USER_AGENT

相關文章