首页
社区
课程
招聘
[原创]CVE-2019-9081 Laravel5.7 反序列化 RCE复现
发表于: 2021-12-23 12:00 14295

[原创]CVE-2019-9081 Laravel5.7 反序列化 RCE复现

2021-12-23 12:00
14295

Laravel Framework 5.7.x版本中的Illuminate组件存在反序列化漏洞,远程攻击者可利用该漏洞执行代码

Laravel5.7

laravel在5.7之后加入了PendingCommand类,同时发现了两个方法

1

PendingCommand类有魔术方法__destruct(),该方法调用run函数,然后run函数执行命令

我们跟进看一下构造方法

2

一共需要用到4个属性

我们继续跟进run方法看一下

3

注意$this->mockConsoleOutput();

我们跟进看一下

4

继续跟进createABufferedOutputMock()

5

继续走下去,我们需要属性$this->test->expectedOutput

6

我们需要找到类中用expectedOutput

经过全局搜索,在Illuminate\Foundation\Testing\Concerns,存在

但是这种类,需要用魔法方法get,来实例化

vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php中存在可以利用的get方法

7

设置键名为expectedOutput的数组,即可利用

现在就缺$app参数,我们回去接着跟进run方法

8

这里也很重要

这里在实例化对象,再去调对应的call方法,跟着Kerne可以看到是在实例化

首先进入到

9

跟进make方法

10

跟进父类的make

11

跟进resolve

12

那么此时发现$concrete的值来自于getConcrete($abstract):

跟进getConcrete

13

注意这里

如果bindings[$abstract]存在,则会返回bindings[$abstract][‘concrete’]

bindings是类Container的属性,并且类Container中也有可以RCE的call方法。

到现在,我们可以整理一下思路

我们选择Illuminate\Foundation\Application而$abstract的值为Illuminate\Contracts\Console\Kernel。
那么此时我们容易知道$bindings只要存在键名为Illuminate\Contracts\Console\Kernel的数组,就能进入该if条件句,那么我们只要按如下进行构造:

exp如下:

routes/web.php添加一条路由

接下来在app/Http/Controllers文件夹下创建文件TaskController.php,源码如下:

利用exp生成payload

然后传值过去

payload:

14

1、删除__destruct中的$this->run()代码段

2、更新到新版本

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$this->app[Kernel::class]
$this->app[Kernel::class]
Illuminate\Contracts\Console\Kernel
Illuminate\Contracts\Console\Kernel
 
 
 
 
 
 
 
 
vendor/laravel/framework/src/Illuminate/Container/Container.php
vendor/laravel/framework/src/Illuminate/Container/Container.php
 
 
if (isset($this->bindings[$abstract])) {
    return $this->bindings[$abstract]['concrete'];
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//