主页 > 网络知识 > 痛心的CodeIgniter4.x反序列化POP链挖掘报告

痛心的CodeIgniter4.x反序列化POP链挖掘报告

CI框架作为PHP国外流行的框架,笔者有幸的挖掘到了它的反序列化POP链,其漏洞影响版本为4.*版本。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

文末有笔者与该厂商的一些“小故事”。

0x01 POP链分析

当然,反序列化漏洞需要反序列化操作的支撑,因此,笔者定义了一个触发该反序列化漏洞的控制器,定义于:/app/Controllers/Home.php

主要内容于:

<?php namespace AppControllers; class Home extends BaseController {     public function index()     {         unserialize($_GET['a']);     } }

__destruct魔术方法为反序列化漏洞最有效的方法,我们可以全局搜索一下__destruct魔术方法的定义。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

可以看到在/system/Cache/Handlers/RedisHandler.php中的__destruct魔术方法中,$this->redis成员属性没有任何实例判断,直接调用close方法,那么$this->redis非常灵活,它可以是任意类的实例化对象,那么我们可以调用任意对象的close()方法。

全局搜索close()方法:

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

通过全局搜索可以看到,在/system/Session/Handlers/MemcachedHandler.php文件中,存在一个close()方法,在264行的isset($this->memcached)为成员属性,是可控的,随后在266行判断$this->lockKey是否存在,如果存在,则调用$this->memcached->delete($this->lockKey)方法,再次全局搜索delete方法。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

通过全局搜索可以看到,在system/Model.php中定义了delete方法,虽然接收两个参数,有幸的是CI框架将第二个参数给予了默认参数:$purge = false。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

在之前的$this->memcached->delete($this->lockKey)虽然只传递进来一个参数,但是这种写法将无视PHP版本号,将此代码继续运行下去。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

921行调用了$this->builder()方法,我们看一下builder方法的定义。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

在1198的赋值操作中可以看到 $table 是可控的,在1206行中进行赋值$this->db->table($table) 的返回内容,我们注意到在1201行进行检测了$this->db->table的所属类,如果我们想要代码继续往下执行,我们这里只能将$this->db赋值为BaseConnection的实例化对象

因为在1206行有调用BaseConnection的table成员方法,我们在 /system/Database/BaseConnection.php中查找一下table。

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

可以看到971行的str_replace操作,当前的类名为BaseConnection,替换后为BaseBuilder类,随后进行 new BaseBuilder操作,以$tableName以及$this传递进去了,需要注意的是,$tableName是可控的。

找到 /system/Database/BaseBuilder.php 文件,并且搜索__construct魔术方法。如图:

 

痛心的CodeIgniter4.x反序列化POP链挖掘报告

 

274行将可控的$tableName传递进from方法了,我们看一下from方法的定义。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!