通过构造包含恶意序列化数据的字节流,并在本地环境中使用目标反序列化函数进行解析,可以复现反序列化漏洞。具体做法是编写一个包含恶意 `__wakeup` 或 `__destruct` 魔术方法的 php 类,利用 `serialize()` 生成 payload,再通过 `unserialize()` 触发执行。若存在条件竞争或类型不匹配,需调整 payload 结构以绕过限制。

unserialize() 如何触发 __wakeup 漏洞
当传入的序列化字符串中对象属性数量与实际不符时,可绕过 __wakeup 方法。在 PHP 5.6 至 7.3 版本中,修改属性数量为大于实际值的数字即可跳过该方法执行。以下代码演示了如何利用此特性调用危险函数。

O:4:"Demo":1:{s:4:"file";s:9:"/etc/passwd";}预期结果:直接输出文件内容,未进入 __wakeup。
POP 链中 __toString 的触发条件
在 POP 链中,__toString 通常在对象被当作字符串使用时触发。例如在日志记录或错误处理场景中,若将恶意对象传入期望字符串的参数,即可触发链式调用。以下代码展示了如何通过继承和组合实现这一触发点。

class Logger { public function log($msg) { echo $msg; } } class Exploit { public function __toString() { return system('id'); } } $l = new Logger(); $e = new Exploit(); $l->log($e);预期结果:执行 id 命令并输出结果。
基于 file_get_contents 输入的具体问题
当反序列化数据来源于用户可控的文件读取操作时,攻击者可通过修改文件内容注入恶意 payload。例如,若程序从 /tmp/session 读取会话数据并反序列化,攻击者可写入包含恶意类的序列化字符串。以下代码模拟了这一场景,展示如何通过文件包含触发漏洞。
$data = file_get_contents('/tmp/session'); unserialize($data);预期结果:若 /tmp/session 包含恶意序列化数据,则触发相应魔术方法。

















