文章出處

前言

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

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()