標題:ThinkPHP 5.x遠程命令執行漏洞分析與復現

taibeihacker

Moderator

0x00 前言​

ThinkPHP官方2018年12月9日發布重要的安全更新,修復了一個嚴重的遠程代碼執行漏洞。該更新主要涉及一個安全更新,由於框架對控制器名沒有進行足夠的檢測會導致在沒有開啟強制路由的情況下可能的getshell漏洞,受影響的版本包括5.0和5.1版本,推薦盡快更新到最新版本。

0x01 影响范围​

5.x 5.1.31,=5.0.23

0x02 漏洞分析​

Thinkphp v5.0.x補丁地址:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f
Thinkphp v5.1.x補丁地址:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815
路由信息中controller的部分進行了過濾,可知問題出現在路由調度時
關鍵代碼:
pj4tvy3p33q23327.png

在修復之前程序未對控制器進行過濾,導致攻擊者可以通過引入\符號來調用任意類方法。
n2gy2t1a4di23328.png

其中使用了$this-app-controller方法來實例化控制器,然後調用實例中的方法。跟進controller方法:
其中通過parseModuleAndClass方法解析出$module和$class,然後實例化$class。
3rieb0ep2zn23330.png

而parseModuleAndClass方法中,當$name以反斜線\開始時直接將其作為類名。利用命名空間的特點,如果可以控制此處的$name(即路由中的controller部分),那麼就可以實例化任何一個類。
接著,我們再往回看路由解析的代碼。其中route/dispatch/Url.php: parseUrl方法調用了route/Rule.php: parseUrlPath來解析pathinfo中的路由信息
mso13gwybty23331.png

代碼比較簡單,就是使用/對$url進行分割,未進行任何過濾。
其中的路由url從Request:path()中獲取
vhdnocakecs23332.png

由於var_pathinfo的默認配置為s,我們可利用$_GET['s']來傳遞路由信息,也可利用pathinfo來傳遞,但測試時windows環境下會將$_SERVER['pathinfo']中的\替換為/。結合前面分析可得初步利用代碼如下:index.php?s=index/\namespace\class/method ,這將會實例化\namespace\class類並執行method方法。

0x03漏洞利用​

docker漏洞環境源碼:https://github.com/vulnspy/thinkphp-5.1.29
本地環境:thinkphp5.0.15+php5.6n+ apache2.0
1.利用system函數遠程命令執行
cbom22f4yju23334.png

2.通過phpinfo函數寫出phpinfo()的信息
0f1alxq0fjn23335.png

3.寫入shell:
mnyjedqkjw323337.png

或者
http://localhost:9096/index.php?s=i...ut_contentsvars[1][]=./test.phpvars[1][]=?php echo 'ok';
ixkgmk3ul3423338.png
 
返回
上方