影響版本: 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擁有兩個sapi
:cgi
和fastcgi
,其中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和-? 顯示幫助
- 這裡我們先啟動
vulhub
的靶機環境
cd /vulhub/php/CVE-2012-1823
sudo docker-compose up -d
-
最簡單的利用方式,當然就是
-s
,可以直接顯示原始碼:
-
一個更好的利用方法:透過使用
-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_exec
、system()
或者其他命令執行函式命令執行 - 透過命令執行執行
wget
下載本機的reverse.php
- 使用PHP程式碼生成一句話木馬
透過/proc/self/environ本地檔案包含
修改User-Agent
為PHP程式碼,檢視HTTP_USER_AGENT
值