ThinkPHP-lang-rce漏洞復(fù)現(xiàn)
漏洞背景
ThinkPHP 是國(guó)內(nèi)使用極為廣泛的 PHP 開發(fā)框架,廣泛應(yīng)用于政企后臺(tái)、CMS、商城等系統(tǒng)。其內(nèi)置的多語言包機(jī)制通過 lang 參數(shù)動(dòng)態(tài)加載語言文件,如: http://example.com/index.php?lang=zh-cn ,在 ThinkPHP 6.0.13 之前版本中,如果啟用了多語言功能,lang 參數(shù)未經(jīng)嚴(yán)格校驗(yàn),直接拼接路徑進(jìn)行語言文件加載,從而導(dǎo)致本地文件包含漏洞(Local File Inclusion, LFI)。
漏洞觸發(fā)點(diǎn)位于語言加載過程中對(duì) lang 參數(shù)的路徑拼接。雖然這個(gè)本地文件包含漏洞 只能包含現(xiàn)有 .php 文件,但攻擊者仍然可以通過配合其他組件如 pearcmd.php 的任意文件寫入功能,寫入惡意 .php 文件,再通過 LFI 包含并執(zhí)行,實(shí)現(xiàn)遠(yuǎn)程命令執(zhí)行(RCE)。
何為組件 pearcmd.php , pearcmd.php 是 PEAR 工具的命令入口文件 PEAR 是 PHP 的包管理工具, pearcmd.php 是它的命令行接口文件,通常存在于: /usr/local/lib/php/pearcmd.php ,它支持通過 GET 請(qǐng)求執(zhí)行命令,比如安裝包、生成文件等。
漏洞復(fù)現(xiàn)
通過vulhub搭建靶場(chǎng),訪問地址如下圖:

首先,由于多語言功能默認(rèn)沒有啟用,可以嘗試包含以下內(nèi)容public/index.php來判斷是否存在漏洞。地址為: http://l192.168.49.1518080/?lang=../../../../../public/index ,如下圖:

如果服務(wù)器崩潰并返回 500 錯(cuò)誤響應(yīng),則存在該漏洞。然后嘗試通過/usr/local/lib/php/pearcmd.php 寫入數(shù)據(jù)(pearcmd 的 config-create 命令會(huì)把內(nèi)容寫入指定文件)。如下圖:

如果服務(wù)器響應(yīng)pearcmd的輸出,則表示漏洞利用成功。然后訪問 http://192.168.49.151:8080/shell.php ,如果出現(xiàn)了phpinfo頁(yè)面表明利用成功了。如下圖:

漏洞總結(jié):
邏輯代碼大體如下:
1 $langSet = input('get.lang'); 2 $langFile = app_path() . 'lang' . DIRECTORY_SEPARATOR . $langSet . '.php'; 3 include $langFile;
利用 /usr/local/lib/php/pearcmd.php 實(shí)現(xiàn) 將攻擊者指定內(nèi)容寫入服務(wù)器上的 shell.php 文件,然后通過 ThinkPHP 的 lang 參數(shù)包含并執(zhí)行它,最終達(dá)到 遠(yuǎn)程代碼執(zhí)行(RCE)。

浙公網(wǎng)安備 33010602011771號(hào)