本篇文章给大家分享的是有关ThinkPHP命令如何执行漏洞,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
ThinkPHP 官方 2018 年 12 月 9 日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的 getshell 漏洞
受影响版本:5.x < 5.1.31, <= 5.0.23
漏洞分析
thinkphp 实验版本:5.0.20
首先,先看看一下官方给出的补丁信息:
大概猜测到这个漏洞是由于框架没有对控制名进行足够的检测导致的。
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正是利用此特性来调用任意类的方法。
根进run()中的路由检测方法routeCheck()
会获取pathinfo信息,
由于配置文件中'var_pathinfo'的值默认为's',所以该pathinfo()函数会获取GET请求中's'对应的值,在这边也就是
index/think/app/invokefunction
之后,Route::parseUrl()方法调用parseUrlPath(),只是通过‘/’做分割,并未做过滤。
获取当前的调度信息后,会执行调用分发函数exec()
这边传入exec的调度信息参数$dispatch为:
根进module方法,即执行模块
该模块获取控制器名为:”think/app“,该处并未对控制器名做过滤。
根进Loader::controller方法,该函数主要作用是实例化控制器,调用getModuleAndClass解析出$module和$class的值分别为“index”和“think/app”,再调用App::invokeClass($class)对$class进行实例化,回到App::module()方法,获得实例化放射类“think/App”后,执行反射类的方法
跟进invokeMethod,可以看到该方法将运行call_user_func_array函数,
返回system('whoami')的结果
以上就是ThinkPHP命令如何执行漏洞,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/228595.html