pikachu-PHP反序列化
阿新 • • 發佈:2020-09-20
概述
序列化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請求,然後對接收的資料進行反序列化,後臺沒有對接收的資料做任何的過濾等安全措施。