前言
PHP存在著一個很有趣的漏洞,PHP對象注入,不過我們通常稱為反序列化漏洞,雖然對于這個漏洞網上介紹的文章有很多,但是我感覺并沒有達到通俗易懂,所以本篇文章將追求介紹最詳細的php反序列化漏洞。力求小白也能看懂。
基礎知識
再介紹漏洞之前我們先要來了解一下什么是反序列化,所有php里面的值,我們都可以使用函數serialize()來返回一個包含字節流的字符串來表示。見下圖:

序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。所以對象A和對象B序列化后并沒有什么區別。
大家是不是看不懂序列化后是什么意思啊。別急,讓我來解釋一下。
s:16代表這個是字符串,字符串長度為16,a:2代表這個是數組,有兩個數值。O代表對象,A和B是類名,a和b是類實例化后的對象名,i是數值類型。
unserialize()函數能夠重新把字符串變回php原來的值。
漏洞產生原因
漏洞的根源在于unserialize()函數的參數可控。如果反序列化對象中存在魔術方法,而且魔術方法中的代碼有能夠被我們控制,漏洞就這樣產生了,根據不同的代碼可以導致各種攻擊,如代碼注入、SQL注入、目錄遍歷等等。
反序列化之代碼注入
我們先來看一段存在漏洞的代碼。

這里__destruct是當一個對象被銷毀時被自動調用的析構方法。
我們可以發現A類中存在魔術方法__destruct,然后unserialize中參數可控。這樣我們就可以控制其中的變量a的值。漏洞就由此嘗試了。
漏洞利用
漏洞利用的思想,使我們模仿一個A類,然后給變量a賦值。我們來注入phpinfo()。
首先使我們模仿一個A類,然后給變量a賦值,執行序列化操作。

得到序列化后的字符串。
將序列化后的字符串提交,注意加上我們注入得代碼。

注入成功

總結
其實漏洞的核心思想還是在于unserialize函數,漏洞利用的核心思路在于控制魔術方法中的代碼從而產生代碼注入,SQL注入,目錄遍歷等一系列的漏洞利用。防御本漏洞就要嚴格控制unserialize函數的參數,對unserialize后的變量內容進行檢查,確保綠色輸入。
就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/64959.html
文章列表