Skip to content

Latest commit

 

History

History
115 lines (61 loc) · 6.81 KB

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

File metadata and controls

115 lines (61 loc) · 6.81 KB

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

1、漏洞描述

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

2、环境安装

到 github 上下载 yii2 的 2.0.37 版本

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

然后进入目录 php yii serve 启动

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

生成 poc,poc.php

发送请求,环境搭建成功

3、漏洞分析:

根据 POC 得知利用链为:
yii\db\BatchQueryResult -> Faker\Generator ->yii\rest\CreateAction 

先分析 yii\db\BatchQueryResult basic/

vendor/yiisoft/yii2/db/BatchQueryResult.php

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

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

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

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

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

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

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

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

Id 为 base/Action 的公共属性

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

1.yii\db\BatchQueryResult-> __destruct->rest

2.Faker\Generator->call->format->call_user_func_array

3.yii\rest\CreateAction->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 注入漏洞复现分析
**