freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

CVE-2020-15148 Yii2反序列化RCE分析与复现
Xz 2021-01-09 15:42:30 444889


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之后的版本即可成功修复此漏洞。

6、参考链接

https://xz.aliyun.com/t/8307

https://www.anquanke.com/post/id/86452

# web安全 # 漏洞分析 # 网络安全技术
本文为 Xz 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Xz LV.1
这家伙太懒了,还未填写个人描述!
  • 5 文章数
  • 18 关注者
加密对抗靶场enctypt——labs通关
2024-11-16
前端动态密钥与非对称加密场景下的测试
2023-10-17
Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现与分析
2021-02-22
文章目录