溫馨提示×

溫馨提示×

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

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

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

發(fā)布時間:2021-11-23 15:13:57 來源:億速云 閱讀:469 作者:小新 欄目:安全技術(shù)

小編給大家分享一下web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1、影響范圍

Yii2 < 2.0.38

2、環(huán)境搭建

影響范圍:Yii2 < 2.0.38

所以我們下載2.0.37即可

https://github.com/yiisoft/yii2/releases/tag/2.0.37

之后直接在根目錄下執(zhí)行php yii serve開啟服務(wù),然后修改下配置文件config/web.php;給cookieValidationKey修改一個任意值,不然會報錯。

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

3、PHP(反)序列化有關(guān)的魔法函數(shù)

環(huán)境搭建好了,就先了解下魔法函數(shù),方便后面利用鏈的理解。

__construct():當對象創(chuàng)建(new)時會自動調(diào)用。但在unserialize()時是不會自動調(diào)用的。

__destruct():當對象被銷毀時會自動調(diào)用。

__call():是在對象上下文中調(diào)用不可訪問的方法時觸發(fā)

__callStatic():是在靜態(tài)上下文中調(diào)用不可訪問的方法時觸發(fā)。

__get():用于從不可訪問的屬性讀取數(shù)據(jù)。

__set():用于將數(shù)據(jù)寫入不可訪問的屬性。

__isset():在不可訪問的屬性上調(diào)用isset()或empty()觸發(fā)。

__unset():在不可訪問的屬性上使用unset()時觸發(fā)。

__sleep():在執(zhí)行序列化函數(shù)serialize()時執(zhí)行。

__wakeup():在執(zhí)行反序列化函數(shù)unserialize()時執(zhí)行。

__toString():允許一個類決定如何處理像一個字符串時它將如何反應(yīng)。

__invoke():腳本嘗試將對象調(diào)用為函數(shù)時,調(diào)用__invoke()方法。

常用魔法函數(shù)圖示,更加直觀理解:

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

4、漏洞分析與復(fù)現(xiàn)

分析:

從大佬們的EXP入手分析

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

如圖所示,EXP執(zhí)行順序為①②③最后RCE

①:new了一個BatchQueryResult對象,導(dǎo)致執(zhí)行了BatchQueryResult類下的__construct函數(shù)

②:new了一個Generator對象,導(dǎo)致執(zhí)行了Generator類下的__construct函數(shù)

③:new了一個CreateAction對象,導(dǎo)致執(zhí)行了CreateAction類下的__construct

最后因為CreateAction類中run()方法中的checkAccess和id的值是可控的,導(dǎo)致了RCE。

根據(jù)EXP中的類,我們跟進每個文件去分析。

先new的BatchQueryResult,所以BatchQueryResult.php就是整個POP鏈的起點。

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

1、BatchQueryResult類中__destruct調(diào)了reset()方法,然后可以看到reset()方法中的$this->dataReader是可控的,這里的$this->dataReader->close()可以利用魔法函數(shù)__call(前面說了,如果執(zhí)行不存在的方法就會調(diào)用call方法),這就說明在EXP的第二個類Generator存在可利用的__call方法,繼續(xù)跟進Generator.php。

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

2、Generator類中看到__call調(diào)用了format方法,format又調(diào)用了call_user_func_array,但是$formatter和arguments都是不可控的;繼續(xù)往下走,$formatter傳入了$this->getFormatter,在這個方法中,$this->formatters是我們可控的,也就是說getFormatter方法的返回值是可控的,call_user_func_array這個函數(shù)的第一個參數(shù)可控,第二個參數(shù)為空;那么EXP中的下一步代入了一個無參數(shù)的方法去RCE;我們?nèi)ゲ榭聪翬XP的最后一步,CreateActiion類中的run()方法,跟進CreateAction.php文件。

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

3、CreateAction類中,run()很明顯可以看到$this->checkAccess以及$this->id都可控,利用鏈就出來了

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

復(fù)現(xiàn):

復(fù)現(xiàn)的第一步,先自己添加一個反序列化的入口,在controllers目錄下新建一個存在反序列化的Action,TestController.php

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

入口建立成功后就可以去執(zhí)行EXP了,執(zhí)行EXP后會得到Base64編碼后的序列化字符

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

將攻擊代碼代入URL即可成功RCE

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

5、修復(fù)建議

升級到2.0.38之后的版本即可成功修復(fù)此漏洞。

web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例

以上是“web中CVE-2020-15148 Yii2反序列化RCE分析與復(fù)現(xiàn)的案例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

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

AI