1. 程式人生 > 實用技巧 >pikachu-PHP反序列化

pikachu-PHP反序列化

概述

序列化serialize()

序列化說通俗點就是把一個物件變成可以傳輸的字串,比如下面是一個物件:

 class S{
        public $test="pikachu";
    }
    $s=new S(); //建立一個物件
    serialize($s); //把這個物件進行序列化
    序列化後得到的結果是這個樣子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表物件名字長度為一個字元
        S:物件的名稱
        1:代表物件裡面有一個變數
        s:資料型別
        
4:變數名稱的長度 test:變數名稱 s:資料型別 7:變數值的長度 pikachu:變數值

反序列化unserialize()

就是把被序列化的字串還原為物件,然後在接下來的程式碼中繼續使用。

   $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的結果為pikachu

序列化和反序列化本身沒有問題,但是如果反序列化的內容是使用者可以控制的,且後臺不正當的使用了PHP中的魔法函式,就會導致安全問題

 常見的幾個魔法函式:
        __construct()當一個物件建立時被呼叫

        __destruct()當一個物件銷燬時被呼叫

        __toString()當一個物件被當作一個字串使用

        __sleep() 在物件在被序列化之前執行

        __wakeup將在序列化之後立即被呼叫

        漏洞舉例:

        
class S{ var $test = "pikachu"; function __destruct(){ echo $this->test; } } $s = $_GET['test']; @$unser = unserialize($s); payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

開啟pikachu靶場的反序列化,先隨便輸入一些內容

接下來我們可以先通過構造一個payload來獲取到一個正確的序列化後的內容,然後把正確的內容進行提交,讓後臺對此內容進行反序列化,執行payload中的惡意JavaScript程式碼,從而獲取到我們想要的資訊。

我們構造的payload為

class S{
    var $test="<script>alert('xss')</script>";
}
echo '<br>';
$a=new S();
echo serialize($a);  //輸入一個序列化後的內容

接著我們通過瀏覽器來開啟這個payload檔案

開啟頁面原始碼,可以看到我們payload序列化後的內容

接著再序列化後的內容貼上到pikachu中提交成功彈窗

我們來檢視後端程式碼後端中他定義了一個類,在類中定義了一個魔法方法__construct(),當這個類被建立時,它就會自動執行。而後臺會去接收一個POST請求,然後對接收的資料進行反序列化,後臺沒有對接收的資料做任何的過濾等安全措施。