ThinkPHP5.x命令執行漏洞分析
0x01 Start
2018.12.10晚上,看到有人發tp5命令執行,第一眼看到poc大致猜到什麼原因,後來看到鬥魚src公眾號的分析文章。這裡分析記錄一下。
0x02 簡單分析
tp的框架啟動不具體說了,這裡從App::run開始分析。App.php第116行呼叫routeCheck函式,該函式返回的內容為:
array(2) { ["type"]=> string(6) "module" ["module"]=> array(3) { [0]=> string(5) "index" [1]=> string(9) "think\app" [2]=> string(14) "invokefunction" } }
在routeCheck呼叫$request->path();獲取相容模式s傳入的模組/控制器/方法

在routeCheck中會讀取route.php中的路由並進行匹配傳入的路由,不成功會呼叫Route::parseUrl處理

,在parseUrl函式1226行呼叫parseUrlPath函式處理模組控制器方法串,使用/分割

parseurl中把parseUrlPath函式返回的陣列:
list($path, $var) = self::parseUrlPath($url); $path = array(3) { [0]=> string(5) "index" [1]=> string(10) "\think\app" [2]=> string(14) "invokefunction" } $module = Config::get('app_multi_module') ? array_shift($path) : null; //$module = index $controller = !empty($path) ? array_shift($path) : null; //$controller = \think\app $action = !empty($path) ? array_shift($path) : null; $action = invokefunction 所以這個地方payload s=module/controller/action s = index/think\app/invokefunction controller不使用/而使用\分割成名稱空間形式即可,這個地方不要第一個\也可以 然後$route = [$module, $controller, $action]; 封裝返回
這裡往下呼叫處理路由就結束了,會return上面封裝那個陣列
array(2) { ["type"]=> string(6) "module" ["module"]=> array(3) { [0]=> string(5) "index" [1]=> string(9) "think\app" [2]=> string(14) "invokefunction" } }
回到App.php 141行進行執行階段$data = self::exec($dispatch, $config);

type為module,case分支執行:
$data = self::module( $dispatch['module'], $config, isset($dispatch['convert']) ? $dispatch['convert'] : null );
在module函式中578行進行了控制器例項化

在592行進行了函式呼叫

0x03 3.x系列呢
看完5.x我又跑回去看了3.x,從3.2.3一直找到2.2全部由下圖程式碼
