---
# System prepended metadata

title: Pickachu 反序列化漏洞
tags: [Pickachu, 反序列化漏洞]

---

# 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