Thinkphp漏洞跟踪

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

漏洞分析环境: https://github.com/vulnspy/thinkphp-5.1.29与phpstudy php-7.0.12-nts+apache

Thinkphp框架中url的访问为index.php/模块/控制器/操作,index.php称为入口文件(pathinfo方式的URL访问),也可使用兼容模式,通过变量s传参/模块/控制器/操作。

Thinkphp漏洞跟踪

Thinkphp漏洞跟踪

Thinkphp漏洞跟踪

根据参考链接中的关键代码,追溯漏洞源文件 /thinkphp/library/think/route/dispatch/Module.php ,如下图所示:

Thinkphp漏洞跟踪

继续跟踪result数组,如下图所示:

Thinkphp漏洞跟踪

发现调用父类init函数,module类继承于抽象类Dispatch,追踪Dispatch如下图所示:

Thinkphp漏洞跟踪

观察判断语句,通过伪变量this对象引用到rule.php文件中,执行doAfter函数,获取路由的后置操作。如下图所示:

Thinkphp漏洞跟踪

这里稍微引入一下路由后置操作简介,至于大佬可以加以补充,小弟就不献丑了

Thinkphp路由为三种模式:

1、普通模式(采用默认的pathinfo方式url):'url_route_on' => false

2、混合模式(该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照默认的PATH_INFO模式访问URL):'url_route_on' => true

3、强制模式(必须定义路由才可访问):'url_route_must' => true 'url_route_on' => true

Thinkphp 5.0以上版本对新的路由功能做了新的增强,支持路由到模块(模块/控制器/操作)、控制器(控制器类/操作)、类(任何类库),也是此次漏洞的原因之一

根据以上描述,分析此次漏洞环境代码,采用为混合模式,在采用s变量获取,触发漏洞。分析获取pathifo的过程,如下图所示:

Thinkphp漏洞跟踪

第一步先判断pathinfo是否有兼容模式的参数,第二步分析pathinfo信息,将ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL三种模式循环赋值给变量$type,使用server函数,将变量$type转换为大写存入 server数组中,当变量server数组已被赋值,则返回server数组,否则返回空,如下图所示:

Thinkphp漏洞跟踪

最终当变量pathinfo不为空时,$pathinfo为删除/符号前后空白字符的字符串,追溯pathinfo函数,找到path函数,如下图所示:

Thinkphp漏洞跟踪

跟踪 path 函数,找到 App.php 文件中的 routeCheck 函数,如下图所示:

Thinkphp漏洞跟踪

可以观察到此函数返回一个Dispatch对象,而module文件中$result = $this->dispatch,继续跟踪Check函数,如下图所示:

Thinkphp漏洞跟踪

返回值为创建的新对象 UrlDispatch ,跟踪 UrlDispatch 类,发现为 Url 的别名引用,如下图所示:

Thinkphp漏洞跟踪

跟踪Url类,发现继承于抽象类Dispatch,再由魔术方法__construct在方法被实现时 用,观察此方法,如下图所示:

Thinkphp漏洞跟踪

此方法用伪变量this将dispatch对象赋值为$dispatch,返回观察Url类,如下图所示:

Thinkphp漏洞跟踪

init方法返回到新对象Module的init方法中,也就是Module.php中parent::init(),其中dispatch通过parseUrl函数赋值给$result,观察parseUrl,如下图所示:

Thinkphp漏洞跟踪

变量module由getConfig函数获取app_multi_module的值,观察得知app_multi_module为真,得到删除第一个数组的变量$path,最后返回一个封装路由route,包含变量module、controller和action,并传递给变量result。

通过以上分析得到变量result的生成结果,当使用explode分割字符串时,输入/index/\think\request/cache,得到如图所示:

Thinkphp漏洞跟踪

通过上述删除第一个数组,赋值给module.php中的变量module,如下图所示:

Thinkphp漏洞跟踪

此时变量module为index,继续观察找到控制器变量controller,如下图所示:

Thinkphp漏洞跟踪

此时变量controller为\think\request,继续观察找到操作名变量actionName,如下图所示:

Thinkphp漏洞跟踪

此时变量actionName为cache,最后进入请求操作,跟踪到操作器controller文件中,找到cache方法,如下图所示:

Thinkphp漏洞跟踪

通过特殊构造达到执行phpinfo的效果,将变量key设置为1|phpinfo,跳过判断是否存在于匿名类中,并通过true===1,进入list函数将变量key和fun分别赋值为1和phpinfo(根据php-7.0.12-nts环境,list赋值为从右向左),从而达到运行phpinfo函数。

第二个poc为:

/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();'

也等同于:

/index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();’

跟踪到invokefunction函数,如下图所示:

Thinkphp漏洞跟踪

通过将function设置为call_user_func_array,vars[0]=system,即可生成system()函数,通过vars[1][]对上述call_user_func_array返回的回调函数system设置参数变量,达到运行系统命令。

参考链接:

http://www.vulnspy.com/cn-thinkphp-5.x-rce/thinkphp_5.x_(v5.0.23%E5%8F%8Av5.1.31%E4%BB%A5%E4%B8%8B%E7%89%88%E6%9C%AC)_%E8%BF%9C%E7%A8%8B%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%EF%BC%88getshell%EF%BC%89/

https://www.jianshu.com/p/73ed6e42d389


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

查看所有标签

猜你喜欢:

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

数学规划

数学规划

黄红选 / 清华大学出版社 / 2006-3 / 45.00元

《数学规划》以数学规划为对象,从理论、算法和计算等方面介绍,分析和求解常见的最优化问题的一些方法,全书共分8章,其中第l章介绍了数学规划的实例、模型以及在分析最优化问题时所涉及的基础知识,第2章至第8章分别讨论了凸分析、线性规划、无约束优化、约束优化、多目标规划、组合优化和整数规划以及全局优化等七个方面的内容,此外,书中每章的最后一节给出了一些习题,书末列出了参考文献和索引。《数学规划》可作为应用......一起来看看 《数学规划》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

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

在线 XML 格式化压缩工具