考点精讲
记忆技巧
序列化 = 对象转字符串,反序列化 = 字符串转对象
最常用魔术方法:__destruct、__wakeup
最常用魔术方法:__destruct、__wakeup
常见误区
真题思路
- 【示例】 关于 PHP 反序列化漏洞,下列说法正确的是()
序列化是把字符串转为对象 反序列化漏洞的产生与魔术方法无关 __destruct 在对象销毁时调用,__wakeup 在反序列化时调用 反序列化数据由攻击者控制也不会产生危害
答案:C
解析:序列化是对象转字符串,反序列化是字符串转对象,A 说反了;漏洞正是借助魔术方法触发恶意代码,B 错;__destruct 销毁时、__wakeup 反序列化时调用,C 正确;数据可控是漏洞产生的关键前提,D 错。
常见问题
Q:序列化和反序列化有什么区别?
A:序列化(serialize)是把对象转换为字符串,便于存储或传输;反序列化(unserialize)是把字符串还原为对象。
Q:常见的魔术方法有哪些?
A:__construct(构造时调用)、__destruct(销毁时调用)、__toString(转字符串时调用)、__sleep(序列化时调用)、__wakeup(反序列化时调用)等。
Q:反序列化漏洞如何触发?
A:当反序列化的数据可由攻击者控制,且对象中存在特定魔术方法(如 __destruct、__wakeup)执行危险操作时,攻击者构造恶意序列化串,触发魔术方法即可执行任意代码。
Q:__wakeup 在什么时候被调用?
A:__wakeup 在对象被反序列化(unserialize)时自动调用。
相关知识
教材出处:第4章 Web 漏洞 反序列化与魔术方法