-
-
[原创]CVE-2019-9081 Laravel5.7 反序列化 RCE复现
-
发表于: 2021-12-23 12:00 14295
-
Laravel Framework 5.7.x版本中的Illuminate组件存在反序列化漏洞,远程攻击者可利用该漏洞执行代码
Laravel5.7
laravel在5.7之后加入了PendingCommand类,同时发现了两个方法
PendingCommand类有魔术方法__destruct()
,该方法调用run函数,然后run函数执行命令
我们跟进看一下构造方法
一共需要用到4个属性
我们继续跟进run方法看一下
注意$this->mockConsoleOutput();
我们跟进看一下
继续跟进createABufferedOutputMock()
继续走下去,我们需要属性$this->test->expectedOutput
我们需要找到类中用expectedOutput
经过全局搜索,在Illuminate\Foundation\Testing\Concerns
,存在
但是这种类,需要用魔法方法get,来实例化
在vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php
中存在可以利用的get方法
设置键名为expectedOutput
的数组,即可利用
现在就缺$app
参数,我们回去接着跟进run
方法
这里也很重要
这里在实例化对象,再去调对应的call方法,跟着Kerne
可以看到是在实例化
首先进入到
跟进make方法
跟进父类的make
跟进resolve
那么此时发现$concrete的值来自于getConcrete($abstract):
跟进getConcrete
注意这里
如果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:
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'
];
}
赞赏
- 牧云·主机管理助手测评 6579
- [原创]JAVA安全—反射 812
- [原创]CISCN2022-东北赛区半决赛eztp解题思路 13033
- [XCTF]第四期个人能力认证考核个人wp 9655
- [原创]记录一次对某CMS漏洞挖掘 1449