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

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($a);

        payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}靶場

靶場

使用payload:

 O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

即可觸發XSS