Yii2 反序列化漏洞复现分析

  • A+
所属分类:代码审计
Yii2 反序列化漏洞复现分析
1、漏洞描述

Yii是一套基于组件、用于开发大型Web应用的高性能PHP框架。Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在调用unserialize() 时,攻击者可通过构造特定的恶意请求执行任意命令。


2、环境安装

到github上下载yii2的2.0.37版本

Yii2 反序列化漏洞复现分析

解压之后,修改/config/web.php文件17行cookieValidationKey,可以随便定义

Yii2 反序列化漏洞复现分析

然后进入目录php yii serve启动

Yii2 反序列化漏洞复现分析

接着添加一个存在漏洞的Action

Yii2 反序列化漏洞复现分析

生成poc,poc.php

Yii2 反序列化漏洞复现分析
Yii2 反序列化漏洞复现分析

发送请求,环境搭建成功

Yii2 反序列化漏洞复现分析

3、漏洞分析:

根据POC得知利用链为:
yiidbBatchQueryResult -> FakerGenerator ->yiirestCreateAction 
先分析yiidbBatchQueryResult basic/
vendor/yiisoft/yii2/db/BatchQueryResult.php

Yii2 反序列化漏洞复现分析

BatchQueryResult中有个__destruct,调用了rest方法,最后调用了close方法。根据POC知道下一个链为FakerGenerator,跟进Generator basic/vendor/fzaninotto/faker/src/Faker/Generator.php

Yii2 反序列化漏洞复现分析

发现该文件并没有close方法,只有__get,__call,__destruct 3个魔术方法,get和destruct感觉都没有什么问题,查看php手册call方法介绍如下:

当对象调用一个不存在的方法时候触发:

Yii2 反序列化漏洞复现分析

所以Generator调用close方法时候会去调用__call方法,跟进该方法:

Yii2 反序列化漏洞复现分析

Call 方法有2个参数,$method为调用的方法值,为close,$attributes为调用方法所传递的参数为空,跟进format方法

Yii2 反序列化漏洞复现分析

format调用了call_user_func_array方法,该方法有两个参数,$formatter为close, $arguments为空,分析getFormatter 方法,发现$this->formatters[$formatter]可控,需要为$this->formatters[“close”],该参数为call_user_func_array第一个参数,这个时候利用该类可以调用任意类的无参方法。根据POC得知,下一环调用了yiirestCreateAction的run方法,查看该方法:

Yii2 反序列化漏洞复现分析

Run方法调用了call_user_func方法,先判断checkAccess是否存在,存在则调用call_user_func方法。

checkAccess为rest/Action.php的公共属性,

Yii2 反序列化漏洞复现分析

Id为base/Action的公共属性

Yii2 反序列化漏洞复现分析

CreateAction继承rest/Action.php,rest/Action.php继承base/Action。所以只需要在序列化CreateAction类的时候指定checkAccess和id参数的值即可调用call_user_func方法,所以整体利用链如下:

1.yiidbBatchQueryResult-> __destruct->rest
2.FakerGenerator->call->format->call_user_func_array
3.yiirestCreateAction->run-> call_user_func

4、安全产品解决方案

百度度御关WAF、高级威胁感知系统,以及智能安全一体化产品已支持该漏洞的检测和拦截,有需要的用户可以访anquan.baidu.com联系我们。

参考链接:
https://github.com/0xkami/cve-2020-15148
https://xz.aliyun.com/t/8307

推荐阅读
Nette框架未授权任意代码执行漏洞分析
从CVE-2020-8816聊聊shell参数扩展
Shiro rememberMe反序列化攻击检测思路
Spring Boot + H2 JNDI注入漏洞复现分析

Yii2 反序列化漏洞复现分析
Yii2 反序列化漏洞复现分析

本文始发于微信公众号(百度安全实验室):Yii2 反序列化漏洞复现分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: