AI 助教问 AI 助教
东方瑞通 · CISP-PTE

反序列化与魔术方法

反序列化漏洞指程序对反序列化数据未做校验,攻击者构造恶意序列化数据,触发魔术方法执行任意代码。

考点精讲

  1. PHP 的 serialize 将对象转为字符串、unserialize 将字符串转回对象,若反序列化数据可控即产生漏洞。魔术方法如 __construct(构造时)、__destruct(销毁时)、__toString(转字符串时)、__sleep(序列化时)、__wakeup(反序列化时)。攻击者构造序列化串,触发 __destruct/__wakeup 等执行恶意代码。

记忆技巧

序列化 = 对象转字符串,反序列化 = 字符串转对象
最常用魔术方法:__destruct、__wakeup

常见误区

  • 混淆序列化与反序列化的方向
  • 忽略魔术方法的触发时机与条件
  • 以为反序列化漏洞只存在于 PHP

真题思路

  • 【示例】 关于 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 漏洞 反序列化与魔术方法

AI 助教

让 AI 助教带你深入学习,把你卡住的地方直接问它

随时为您答疑解惑

开始答疑