CVE-2016-7124漏洞復現
__wakeup()魔術方法繞過
實驗環境
操作機:Windows 10
服務器:apache 2.4
數據庫:mysql 5.0
PHP版本:5.5
漏洞影響版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
漏洞產生原因:
如果存在__wakeup方法,調用 unserilize() 方法前則先調用__wakeup方法,但是序列化字符串中表示對象屬性個數的值大於 真實的屬性個數時會跳過__wakeup的執行
漏洞復現
編寫測試腳本
Test1.php
腳本上標明接收s參數,對其反序列化后輸出name屬性的值
訪問test1.php
根據代碼可以看出反序列化之前先調用了__wakeup 方法,再調用_destruct 方法。
將傳入的序列化數據的對象變量個數由1更改為2,頁面只執行了__destruct方法,而且輸出name屬性時報錯,是由於反序列化數據時失敗無法創建對象。
漏洞利用
更改測試代碼
test.php
其中 __destruct方法在調用時將name參數寫入wcute.php文件但是由於__wakeup方法清除了對象屬性,所以在調用__destruct時已經沒有了name屬性,因此文件將會寫入失敗。
將對象屬性個數改為2繼續嘗試,成功繞過__wakeup方法執行,將代碼寫入文件