PHP反序列化
阿新 • • 發佈:2020-08-03
概述
序列化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