php yii2模块,Yii2框架Gii模块 RCE 分析

原标题:Yii2框架Gii模块 RCE 分析

f99ef5380c191bb9440b668062971a88.png

利用周末时间分析了Yii2框架的一个RCE漏洞,利用了框架可以写PHP模板的功能,控制写入的内容为恶意代码,实现对指定的文件写入php 命令执行语句,调用PHP从而获取系统权限。

0x01 Yii 介绍

Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用。因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站、社区、内容管理系统(CMS)、 电子商务项目和 RESTful Web 服务等。和其他 PHP 框架类似,Yii 实现了 MVC(Model-View-Controller) 设计模式并基于该模式组织代码,Yii 非常易于扩展,代码简洁优雅。

0x02 环境搭建

利用docker 原生ubuntu镜像搭建漏洞调试环境

0x01 composer 安装

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。

你可以将此文件放在任何地方。如果你把它放在系统的 PATH 目录中,你就能在全局访问它。在类Unix系统中,你甚至可以在使用时不加 php 前缀。

你可以执行这些命令让 composer 在你的系统中进行全局调用:

curl-sS https://getcomposer.org/installer | php

mv composer.phar /usr/local/bin/composer

0x02 yii2 安装

安装composer过后,需要安装git 以及php插件,composer在安装yii2框架时会从git上clone项目,只不过不保留.git文件夹。

apt installapache2 php

apt installzip unzip git php-mbstring php-curl php-dom -y

composer create- project--prefer-dist yiisoft/yii2-app-basic basic

25d830e5decb26273b2a2015620c19af.png

至此yii2框架就基本搭建完成了,有了composer 之后确实方便了很多。

0x03 数据库搭建及连接

利用docker搭建数据库,注意在数据库中创建新库和数据表

dockerrun --name mysql -e MYSQL_ROOT_PASSWORD= 123456-d mysql: 5. 7

vim / var/www/html/basic/config/db.php

56229363a4c82841514ef4a5bed71368.png

0x04 Xdebug 安装

pecl PHP Extension Community Library的缩写,即PHP 扩展库。https://pecl.php.net/

PECL是使用C语言开发的,通常用于补充一些用PHP难以完成的底层功能,往往需要重新编译或者在配置文件中设置后才能在用户自己的代码中使用。

利用pecl 安装xdebug 并进行配置

apt-get installphp-pear

apt- getinstallphp-phpize

pecl installxdebug

将xdebug.so与php相关联,xdebug.ini 配置如下

zend_extension=/usr/lib/php/20190902/xdebug.so

xdebug.remote_enable=1

xdebug.remote_connect_back=0

xdebug.remote_host=172.19.0.12

xdebug.remote_port=9000

向apache的php配置添加xdebug.ini配置文件,并重启服务

cp/usr/share/php/docs/xdebug/xdebug.ini /etc/php/7.4/apache2/conf.d/

serviceapache2 restart

02f0db04b45449a7cec04af1592c3712.png

0x05 远程调试配置

因为服务在服务器端,本地需要phpstorm调试需要配置端口转发,将本地端口转到服务器上去。又因为服务在服务器docker内部因此也需要把ssh端口转发出来。操作如下

在服务器执行

1ab24f7749a482a2892d5c3b3acc4657.png

在docker内执行

8253587ce6ebbcaed49b374126d4ab41.png

在本地执行

4533cbf9b67a6471fdf29256eed4b1b2.png

配置phpstorm,进行远程文件关联

ff1edf430361da136aa172f8e3008c45.png

配置sftp

2906326b63f8f321b3470d47c7089af1.png

0x06 添加白名单

gii 默认添加了白名单访问,这里只需加个*就可以了

566165c916c1050661178deaa4c121b5.png

0x03漏洞利用

0x1 生成恶意代码文件

所有环境都配置好后,选择创建的数据表并制定类名

bf917fe8f7146981d567f1142bcce323.png

在Message Category字段处填写恶意代码,如下图所示

4247702b53463206dd4f04d3b33ab8fb.png

0x2 触发恶意文件

98b51e2eafc464288c63a20cbf30ef44.png

0x03 漏洞原理及调试0x0 漏洞原理

yiisoft/yii2-gii/src/Generator.php#L505 存在参数拼接,而且没有检查用户传递的参数。

1e66572caa737fda5dcfc72f6b5daada.png

0x1 路由介绍

yii用了统一的路由分发,路由的工作可以分为两步:

从请求中解析出一个路由和相关参数;

根据路由生成响应的控制器操作,来处理该请求。1. 解析参数

Application.php:103, yiiwebApplication->handleRequest

98a02afdb5594603df8e135e3b9a9327.png

从url中获取route 和 参数

0b7b0adbc72cba3c9460c100f90a71cc.png

调用栈关系

Request.php:699, yiiwebRequest->getQueryParam

UrlManager.php:365, yiiwebUrlManager->parseRequest

Request.php:275, yiiwebRequest->resolve

Application.php:82, yiiwebApplication->handleRequest

Application.php:386, yiiwebApplication->run

index.php:12, {main}

0x2 生成控制器

7bf7c85319d15ebe9e7e1f30486350e4.png

Module.php:522, yiiwebApplication->runAction

ebb77addc941cd63724607face88cc4d.png

具体实现将url get参数分割成id和route,匹配是不是已配置 module

25c32b736556db3647ae479deb39342c.png

如果不是已有module那么将会根据id生成controller

a6c730ea14c2b3f3ec23fe79fd2a9032.png

4720c42da627052f75b52dbee70b0998.png

完整调用栈如下

Module.php:643, yiiwebApplication->createControllerByID

Module.php:596, yiiwebApplication->createController

Module.php:522, yiiwebApplication->runAction

Application.php:103, yiiwebApplication->handleRequest

Application.php:386, yiiwebApplication->run

index.php:12, {main}

最后在runwithParams函数中完成类函数调用

7565c1d9336e6c41c15c7df501bba83d.png

0x3 可控参数传递链

在生成恶意代码的时候,是将我们传入的post参数写了进去。这个过程还是比较复杂的,调试跟了下归结为几个步骤。

actionPreview功能将收到的post参数解析带入到$generator对象中

actionPreview将解析好的对象成员保存为json格式在runtime目录下

actionView读取json格式数据并解析成对象成员变量

调用到renderFile生成php code并将其写入文件中

1. actionPreview post参数解析

在DefaultController类中

7d5ba42bf7a3722c740073e0c0925040.png

855064821ab1a16fee735ef2a38c0a95.png

2. actionPreview 保存为json

该操作将post包中的参数保存为json格式,并存储到文件中

8c4b89eb39821e7e1af43bf94ea1c9e7.png

3. actionView 读取json文件

从json文件中解析类成员变量

be97e6ef269a3fcf7d5ca488d471eb01.png

4. 文件生成

漏洞生成的文件如下

d88ba6a081b79b8e90d00d901451dcff.png

026a1d42a9ac404c512e693d6283cf89.png

0x04 补丁分析

简单的加了个过滤

bcf17e63fd6b46a3a9a1f1f2f054026f.png

参考链接请点击文末“阅读原文”查看~返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值