千家信息网

web中CVE-2020-15148 Yii2反序列化RCE分析与复现的案例

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,小编给大家分享一下web中CVE-2020-15148 Yii2反序列化RCE分析与复现的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们
千家信息网最后更新 2025年02月01日web中CVE-2020-15148 Yii2反序列化RCE分析与复现的案例

小编给大家分享一下web中CVE-2020-15148 Yii2反序列化RCE分析与复现的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1、影响范围

Yii2 < 2.0.38

2、环境搭建

影响范围:Yii2 < 2.0.38

所以我们下载2.0.37即可

https://github.com/yiisoft/yii2/releases/tag/2.0.37

之后直接在根目录下执行php yii serve开启服务,然后修改下配置文件config/web.php;给cookieValidationKey修改一个任意值,不然会报错。

3、PHP(反)序列化有关的魔法函数

环境搭建好了,就先了解下魔法函数,方便后面利用链的理解。

__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。

__destruct():当对象被销毁时会自动调用。

__call():是在对象上下文中调用不可访问的方法时触发

__callStatic():是在静态上下文中调用不可访问的方法时触发。

__get():用于从不可访问的属性读取数据。

__set():用于将数据写入不可访问的属性。

__isset():在不可访问的属性上调用isset()或empty()触发。

__unset():在不可访问的属性上使用unset()时触发。

__sleep():在执行序列化函数serialize()时执行。

__wakeup():在执行反序列化函数unserialize()时执行。

__toString():允许一个类决定如何处理像一个字符串时它将如何反应。

__invoke():脚本尝试将对象调用为函数时,调用__invoke()方法。

常用魔法函数图示,更加直观理解:

4、漏洞分析与复现

分析:

从大佬们的EXP入手分析

如图所示,EXP执行顺序为①②③最后RCE

①:new了一个BatchQueryResult对象,导致执行了BatchQueryResult类下的__construct函数

②:new了一个Generator对象,导致执行了Generator类下的__construct函数

③:new了一个CreateAction对象,导致执行了CreateAction类下的__construct

最后因为CreateAction类中run()方法中的checkAccess和id的值是可控的,导致了RCE。

根据EXP中的类,我们跟进每个文件去分析。

先new的BatchQueryResult,所以BatchQueryResult.php就是整个POP链的起点。

1、BatchQueryResult类中__destruct调了reset()方法,然后可以看到reset()方法中的$this->dataReader是可控的,这里的$this->dataReader->close()可以利用魔法函数__call(前面说了,如果执行不存在的方法就会调用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都可控,利用链就出来了

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

复现:

复现的第一步,先自己添加一个反序列化的入口,在controllers目录下新建一个存在反序列化的Action,TestController.php

入口建立成功后就可以去执行EXP了,执行EXP后会得到Base64编码后的序列化字符

将攻击代码代入URL即可成功RCE

5、修复建议

升级到2.0.38之后的版本即可成功修复此漏洞。

以上是"web中CVE-2020-15148 Yii2反序列化RCE分析与复现的案例"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

方法 函数 序列 对象 分析 属性 魔法 成功 参数 文件 篇文章 案例 上下 上下文 入口 内容 字符 数据 是在 漏洞 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 现代网络存储是采用单一服务器吗 数据库中目是列还是行 周口网络安全监察部门电话 济宁市人民银行网络安全宣传 手游服务器网络不佳多久能修复 软件服务器连接设置地址怎么改 沃享科技与移动互联网 数据库pemporary 能用的时间服务器地址 王牌战争什么服务器可以掉东西 深圳软件开发经理 电脑金蝶服务器ip地址 软件开发主要有 北京中欧软件开发孙学章 数据库更改创建时间 安装数据库补丁一直验证用户 四川系统软件开发哪家正规 江苏工程软件开发特点 软件开发主题ppt 学校网络安全 管理制度 智慧芽专利数据库培训 网络安全法宣贯会议致辞 浙江软件开发公司注册 数据库对工作有什么用 系统软件开发正规平台 计算机专业可以做软件开发吗 网络安全工程师教程视频 字节跳动软件开发面试 网络安全龙头公司股票有哪些 马桶起床战争的服务器
0