原理:未對用戶輸入的序列化字符串進行檢測,導致攻擊者可以控制反序列化過程,從而導致代碼執行,SQL注入,目錄遍歷等不可控后果。
在反序列化的過程中自動觸發了某些魔術方法。
漏洞觸發條件:unserialize函數的變量可控,php文件中存在可利用的類,類中有魔術方法
魔術方法:
__construct()當一個對象創建時被調用
__destruct()當一個對象銷毀時被調用
__toString()當一個對象被當作一個字符串使用
__sleep() 在對象在被序列化之前運行
__wakeup將在序列化之后立即被調用
序列化數據格式:

示例:
<?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()):

