ThinkPHP 5.x RCE分析

第一次进行代码量这么大的分析,记录一下,个人感觉新手真的不适应这种,应该找点小一点的cms去分析,如果不懂MVC架构真的可能会懵。。。

前言

在分析这个之前还看了两篇tp5的RCE漏洞,这两个洞都是很相似的,都是利用一个可控的变量dispatch去实现到最后还是构造出回调函数,可以学习一下,感觉这里面的思路就是本文分析漏洞的来源

https://xz.aliyun.com/t/3845

https://xz.aliyun.com/t/3845

我这里已tp 5.0.22为例子,环境是phpstudy搭建的

补丁

影响版本
THINKPHP 5.0.5-5.0.22

THINKPHP 5.1.0-5.1.30

5.0.x补丁地址:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f

kDf8x0.png

5.1.x补丁地址:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815

漏洞分析

补丁中加了正则限制了控制器的自定义初始化

payload:

localhost/tp52/public/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir

根据补丁下的点,动态跟踪一下是否是因为controller没有做好过滤而实体化,确实是如此

kD51Gd.png

根据传进去的payload,控制器以及下面的方法都会发生对应的变化,下面就可以分析一下攻击链的流程

可以从入口文件一级一级跟踪,进入到App.php中,这里应该涉及到一个开发的知识,在App.php中,会根据请求的URL调用routeCheck进行调度解析在App.php中,会根据请求的URL调用routeCheck进行调度解析获得到$dispatch,所以payload是一定要经过那里的,可以在那里加断点进行调试

定位到/thinkphp/library/think/App.php:116

$dispatch = self::$dispatch;

            // 未设置调度信息则进行 URL 路由检测
            if (empty($dispatch)) {
   
                $dispatch = self::routeCheck($request, $config);
            }

            // 记录当前调度信息
            $request->dispatch($dispatch);


......
    $data = self::exec($dispatch, $config);//这个函数很关键

继续跟进routeCheck这个函数,同样在App.php里面

kDo5K1.png

继续跟进到path方法里面,然后这里有一个pathinfo()函数,继续跟进

public function path()
{
   
    if (is_null($this->path)) {
   
        $suffix   = Config::get('url_html_suffix');
        $pathinfo = $this->pathinfo();
        if (false === $suffix) {
   
            // 禁止伪静态访问
            $this->path = $pathinfo;
        } elseif ($suffix) {
   
            // 去除正常的URL后缀
            $this->path = preg_replace('/\.(' . ltrim($suffix, '.') . ')$/i', '', $pathinfo);
        } else {
   
            // 允许任何后缀访问
            $this->path = preg_replace('/\.' . $this->ext() . '$/i', '', $pathinfo);
        }
    }
    return $this->path;
}

Config::get('var_pathinfo')是配置文件中的设置的参数,默认值为s,怎么找到这个变量?可以全局搜索一下,可以搜索到其中一个配置文件里面有

kDThFS.png

从GET中获取键值,然后赋值给routeCheck中的$path,这里也就是index/think\app/invokefunction

kDTvYF.png

然后开始进入路由检测的部分,经过check的检查后会进入else的分支,但这一部分对于我们需要控制的变量没有任何影响,关键是$result以及$must这两个变量的赋值结果,这也是导致了后面操作的关键,可以进入Route::parseUrl函数

public static function routeCheck($request, array $config)
    {
   
        $path   = $request->path();
        $depr   = $config['pathinfo_depr'];
        $result = false;

        // 路由检测
        $check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on'];
        if ($check) {
   
            // 开启路由
        
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ThinkPHP是一个开源的PHP开发框架,它的版本3.2.x是一个老版本,存在远程命令执行(RCE)漏洞。这个漏洞允许攻击者通过构造恶意请求来执行任意的系统命令,从而获得对应用服务器的完全控制权限。 这个漏洞的原因是在ThinkPHP 3.2.x版本的核心代码中没有对用户的输入进行充分的过滤和校验。攻击者可以利用这个漏洞来执行各种恶意操作,比如上传恶意文件、修改数据库内容或者获取系统敏感信息等。 为了利用这个漏洞,攻击者需要构造一个特殊的请求,其中包含可执行的系统命令。然后将这个请求发送到受影响的应用程序的漏洞点上。当应用程序在处理这个请求时,会将其中的系统命令当作可执行代码来执行,最终导致攻击者获取对应用服务器的控制权限。 为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架。在最新版本中,开发者已经修复了这个漏洞,并加强了对用户输入的过滤和校验。此外,用户还可以根据自己的需求对应用程序进行进一步的安全加固,比如限制上传文件的类型和大小,对用户输入进行严格的过滤和校验等。 总之,ThinkPHP 3.2.x版本存在远程命令执行漏洞,攻击者可以通过构造恶意请求来执行任意的系统命令。为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架,并加强应用程序的安全加固措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值