ThinkPHP命令如何执行漏洞

本篇文章给大家分享的是有关ThinkPHP命令如何执行漏洞,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都网站制作、外贸网站建设、湄潭网络推广、微信小程序定制开发、湄潭网络营销、湄潭企业策划、湄潭品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供湄潭建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

ThinkPHP 官方 2018 年 12 月 9 日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的 getshell 漏洞
受影响版本:5.x < 5.1.31, <= 5.0.23

漏洞分析

thinkphp 实验版本:5.0.20
首先,先看看一下官方给出的补丁信息:
ThinkPHP命令如何执行漏洞
大概猜测到这个漏洞是由于框架没有对控制名进行足够的检测导致的。
poc:
http://localhost:8888/index.php?s=index/think\App/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

当index.php加载thinkphp框架引导文件后,会执行应用,即执行think\App::run()方法,\表示将App作为类名来调用,payload正是利用此特性来调用任意类的方法。
ThinkPHP命令如何执行漏洞
根进run()中的路由检测方法routeCheck()
ThinkPHP命令如何执行漏洞
会获取pathinfo信息,
ThinkPHP命令如何执行漏洞
由于配置文件中'var_pathinfo'的值默认为's',所以该pathinfo()函数会获取GET请求中's'对应的值,在这边也就是
index/think\app/invokefunction
之后,Route::parseUrl()方法调用parseUrlPath(),只是通过‘/’做分割,并未做过滤。
ThinkPHP命令如何执行漏洞
获取当前的调度信息后,会执行调用分发函数exec()
ThinkPHP命令如何执行漏洞
这边传入exec的调度信息参数$dispatch为:
ThinkPHP命令如何执行漏洞

根进module方法,即执行模块
ThinkPHP命令如何执行漏洞
该模块获取控制器名为:”think\app“,该处并未对控制器名做过滤。
根进Loader::controller方法,该函数主要作用是实例化控制器,调用getModuleAndClass解析出$module和$class的值分别为“index”和“think\app”,再调用App::invokeClass($class)对$class进行实例化,回到App::module()方法,获得实例化放射类“think\App”后,执行反射类的方法
ThinkPHP命令如何执行漏洞
跟进invokeMethod,可以看到该方法将运行call_user_func_array函数,
ThinkPHP命令如何执行漏洞
返回system('whoami')的结果
ThinkPHP命令如何执行漏洞

以上就是ThinkPHP命令如何执行漏洞,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


当前题目:ThinkPHP命令如何执行漏洞
文章位置:http://azwzsj.com/article/gchdci.html