原理:未對用戶輸入的序列化字符串進行檢測,致使攻擊者能夠控制反序列化過程,從而致使代碼執行,SQL注入,目錄遍歷等不可控後果。php
在反序列化的過程當中自動觸發了某些魔術方法。函數
漏洞觸發條件:unserialize函數的變量可控,php文件中存在可利用的類,類中有魔術方法this
魔術方法:spa
__construct()當一個對象建立時被調用對象
__destruct()當一個對象銷燬時被調用blog
__toString()當一個對象被看成一個字符串使用字符串
__sleep() 在對象在被序列化以前運行io
__wakeup將在序列化以後當即被調用function
序列化數據格式:class
示例:
<?php class Example { var $var = ''; function __destruct() { eval($this->var); } } unserialize($_GET['a']); ?>
接下來構造序列化數據:a=O:4:"test":1:{s:1:"b";s:10:"phpinfo();";}
成功顯示了phpinfo頁面:在反序列化該數據時,自動觸發了_destruct()函數,執行 eval(phpinfo()):