# Pickachu 反序列化漏洞 ###### tags: `Pickachu` `反序列化漏洞` ### 序列化要幹嗎? 對象轉換成一個字節序列,能夠通過網絡傳輸、文件存儲等方式傳輸 ,傳輸過程中卻不必擔心數據在不同機器、不同環境下發生改變,也不必關心字節的順序或其他任何細節,並能夠在以後將這個字節序列完全恢復為原來的對象(恢復這一過程稱之為反序列化) ### code: ```php= <?php class S{ var $test = "pikachu"; function __construct(){ echo $this->test; } } //O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} $html=''; if(isset($_POST['o'])){ $s = $_POST['o']; if(!@$unser = unserialize($s)){ $html.="<p>大兄弟,來點勁爆點兒的!</p>"; }else{ $html.="<p>{$unser->test}</p>"; } } ?> ``` 定義了一個class 名為S 序列化後得到的結果是這個樣子的: ``` O:1:"S":1:{s:4:"test";s:7:"pikachu";} ``` ``` O:代表object 1:代表對象名字長度為一個字符 S:對象的名稱 1:代表對象裡面有一個變量 s:數據類型 4:變量名稱的長度 test:變量名稱 s:數據類型 7:變量值的長度 pikachu:變量值 ``` 不經意間,我們查看源碼會把 post 的數據給反序列化,如果使用者把 class S 的序列化竄改: 裡面的屬性也就改變了 ``` O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} ``` ## 魔術方法 ### __construct(),類的構造函數 通常構造方法被用來執行一些有用的初始化任務,如對成員屬性在創建對象時賦予初始值。 --- ### __destruct(),類的析構函數 析構方法允許在銷毀一個類之前執行的一些操作或完成一些功能,比如說關閉文件、釋放結果集等。 unset函數之類的..... --- ### __sleep(),執行serialize()時,先會調用這個函數 在一個類要傳給對方前,先把一些,把不想給看得屬性隱藏起來,或新增一些屬性給對方 --- ### __wakeup() 魔術方法, 當 unserialize() 反序列化一個對象成功後會自動調用該對象 先設定好要新增的屬性,或是改變屬性。對方反序列化打開後,會自動調用 --- ### __toString 當我們使用 echo 語句輸出一個對象時,會自動檢查一個對像有沒有定義 _toString() 方法,如果定義了,就會輸出 __toString() 方法的返回值,如果沒有定義,那麼會直接拋出一個異常,表明該對像不能直接轉換為字符串 --- ### 魔術方法教學:(關鍵字PHP 魔術方法) https://www.twle.cn