0x00 前景
互联网上披露了该OA的反序列化漏洞,趁有时间分析了一下链。
0x01 yii2环境搭建
下载yii2对比OA的yii目录,发现OA少了很多拓展,但多了yii-redis,这大概就是链条的关键了
部署YIi2后,安装一个redis拓展(https://github.com/yiisoft/yii2-redis)
使用命令安装:安装在 /vendor/yiisoft/yii2-redis目录
composer require --prefer-dist yiisoft/yii2-redis:"~2.0.0"
添加配置:/vendor/yiisoft/extensions.php
'yiisoftyii2-redis' => array(
'name' => 'yiisoft/yii2-redis',
'version' => '2.0.0',
'alias' =>
array (
'@yii/redis' => $vendorDir . '/yiisoft/yii2-redis',
),
),
0x03 链条流程
语言组织能力有限,流水线描述如下:
反序列化触发db/BatchQueryResult.php # __destruct(),进入 reset()
_dataReader 可控,调用某个类的close()

全局搜索close(),进入db/DataReader.php,通过_statement 触发__call()

进入 redis/Connection.php --> __call() ,(审计时,之所以不在 _dataReader 触发__call() ,是因为Connection类存在close(),用不到)

配置可控参数,进入executeCommand() --> open()

配置可控参数,让后几个if取反,走到 initConnection()

trigger() extends base/Component

base/Component.php, 明显用了call_user_func,关键参数是可以控制的

控制 $handler[0]的值,回调 rest/CreateAction.php --> run()
两个参数可控,导致RCE,链条到此截止。

原文始发于微信公众号(XINYU2428):某达反序列化链分析