?
?
?
?
?
?
?web滲透PHP反序列化漏洞
1)PHP反序列化漏洞
反序列我們可以控制對象中的值進行攻擊
O:1:"C":1:{s:3:"cmd";s:8:"ipconfig";}
http://127.0.0.1/1.php?x=O:1:%22C%22:1:{s:3:%22cmd%22;s:3:%22ver%22;}
?
常見的反序列化
魔術方法:PHP 中特殊方法(如__construct、__destruct、__wakeup等)在對象生命周期自動調用,若方法中存在危險操作(如命令執行),可被反序列化觸發。
漏洞繞過:如 CVE-2016-7124(PHP 5.6.25 前的__wakeup方法繞過,通過修改對象屬性數量使__wakeup失效)。
原生類:利用 PHP 內置類(如DirectoryIterator、SimpleXMLElement)實現文件遍歷、XXE 等攻擊。
Phar 文件:Phar 文件包含序列化元數據,即使無unserialize函數,通過文件操作函數(如file_exists)也可觸發反序列化。
字符串逃逸:當程序對序列化字符串進行過濾 / 替換時,可通過構造特殊字符串改變序列化結構,實現屬性注入。
?
黑盒查看漏洞:
功能關聯:觀察功能是否涉及對象存儲 / 傳輸(如用戶配置、會話管理、數據備份),此類功能可能使用序列化。
參數測試:對疑似傳入序列化數據的參數(如data、payload、user)傳入畸形序列化字符串,觀察是否返回 PHP 錯誤(如unserialize()錯誤)。
?
白盒代碼審計:
關鍵詞搜索:查找unserialize()函數,確認其參數是否可控(如來自用戶輸入的$_GET、$_POST、$_COOKIE)。
跟蹤變量:確認可控變量是否直接傳入unserialize(),且未經過嚴格過濾。
分析類結構:檢查反序列化涉及的類是否包含危險魔術方法或函數調用(如system()、exec())。
?
?
?
2)反序列檢查方法
黑盒測試:
參數探測:收集所有用戶可控參數(GET/POST/COOKIE/ 請求體),嘗試傳入基礎序列化字符串(如O:0:{}),觀察響應差異。
畸形測試:傳入不完整 / 錯誤的序列化數據(如O:1:"A":),若返回unserialize()相關錯誤(如Error at offset),說明存在反序列化操作。
功能觸發:結合業務功能(如提交配置、恢復數據),在關鍵步驟傳入惡意序列化字符串,觀察是否執行預期操作(如文件生成、命令輸出)。
?
白盒測試:
函數定位:全局搜索unserialize(),標記所有調用位置。
數據流分析:確認unserialize()的參數是否來自用戶輸入,是否經過過濾(如preg_replace、htmlspecialchars等),過濾規則是否可繞過。
類與方法審計:分析反序列化涉及的類及其魔術方法,判斷是否存在可利用的危險操作(如調用eval()、文件寫入等)。
?
?
?
3)反序列工具
PHPGGC:PHP 反序列化漏洞利用工具,包含多種框架(如 Laravel、ThinkPHP、Yii)的 Gadget 鏈,可直接生成惡意序列化字符串。
Burp Suite 插件:如Deserialization Scanner,可自動檢測請求中可能存在的反序列化參數并嘗試注入測試 payload。
手動構造工具:Python 腳本(如通過pickle模塊輔助生成符合格式的序列化字符串)、在線 PHP 序列化 / 反序列化工具(用于驗證 payload 格式)。
漏洞掃描器:Nessus、AWVS 等包含反序列化漏洞檢測模塊,可批量掃描目標是否存在相關漏洞。
?
?
?
4)靶場
DVWA(Damn Vulnerable Web Application):包含反序列化漏洞模塊,適合入門學習基礎利用。
CTF 平臺:CTFtime、XCTF 等平臺的 Web 題目中常見反序列化考點(如 “安恒杯”“西湖論劍” 相關題目)。
VulnHub 靶機:如Mutillidae II(包含反序列化漏洞場景)、Metasploitable 3(集成多種 Web 漏洞)。
框架漏洞環境:通過Vulhub搭建特定框架漏洞環境(如 ThinkPHP 5.x 反序列化漏洞、Laravel deserialization RCE)。
自定義環境:手動編寫含漏洞的 PHP 代碼(如調用unserialize($_GET['x'])且類中包含__destruct方法執行system()),本地測試驗證。
?
?
<?php
// 一個簡單的文件操作類
class FileHandler {
? ? private $filename;
? ? private $content;
?
? ? public function __construct($filename = '') {
? ? ? ? $this->filename = $filename;
? ? }
?
? ? // 魔術方法:當對象被反序列化時調用
? ? public function __wakeup() {
? ? ? ? // 危險操作:直接使用成員變量作為命令執行
? ? ? ? if (!empty($this->filename)) {
? ? ? ? ? ? // 這里存在命令注入漏洞
? ? ? ? ? ? exec("type " . $this->filename, $output);
? ? ? ? ? ? $this->content = implode("\n", $output);
? ? ? ? }
? ? }
?
? ? public function getContent() {
? ? ? ? return $this->content;
? ? }
}
?
// 接收用戶輸入的序列化數據
if (isset($_GET['data'])) {
? ? $data = $_GET['data'];
? ? // 反序列化操作,存在安全風險
? ? $fileHandler = unserialize($data);
? ??
? ? if ($fileHandler instanceof FileHandler) {
? ? ? ? echo "<pre>文件內容:\n" . $fileHandler->getContent() . "</pre>";
? ? } else {
? ? ? ? echo "無效的數據格式";
? ? }
} else {
? ? echo "請通過data參數提交數據";
}
?>
?