PHP反序列化漏洞:从入门到实战

发布时间:2026/5/25 11:46:02

PHP反序列化漏洞:从入门到实战 一、基础铺垫类与对象理解反序列化先搞懂两个最基础的概念类一类事物的抽象表示定义统一的属性与方法。对象类的实体化结果不同对象拥有独立的属性值。PHP 反序列化的本质就是字符串 ↔ 对象的相互转换而漏洞就藏在这个转换过程中。二、序列化与反序列化核心原理1. 为什么要序列化方便数据跨脚本 / 跨服务传输方便持久化存储写入数据库、文件方便加密处理PHP 提供两个原生函数实现转换serialize()序列化把对象转为字符串unserialize()反序列化把字符串还原为对象2. 序列化格式规则标准序列化字符串示例O:4:user:2:{s:3:age;i:18;s:4:name;s:3:LEO;}格式含义拆解O代表这是一个对象4类名的字符长度user类名2对象的成员变量数量常用数据类型结构数据类型序列化结构字符串s: 长度值整数i: 值布尔值b:1/0;空值N;数组a: 长度:{...};对象O: 类名长度类名属性数:{...};3. 访问修饰符对序列化的影响PHP 中public/protected/private的序列化格式完全不同这是构造 Payload 的关键public直接使用属性名protected格式为%00*%00属性名private格式为%00类名%00属性名示例代码class A{ public $public_a 1; protected $protected_a 1; private $private_a 1; } $a new A(); echo serialize($a);输出结果三、魔法函数反序列化漏洞的入口反序列化过程中PHP 会自动触发特定魔法函数这是漏洞利用的核心入口魔法函数触发条件__construct()对象创建new时__wakeup()unserialize () 反序列化时优先触发__sleep()serialize () 序列化时__destruct()对象销毁时触发__toString()对象被当作字符串使用时__get()读取不可访问 / 不存在的属性时__invoke()对象被当作函数调用时漏洞核心规律执行unserialize()时先调用__wakeup()脚本结束后自动调用__destruct()这两个函数是最常用的利用点。四、PHP 反序列化漏洞利用方式1. 基础利用控制任意类变量当unserialize()的参数完全可控时可直接构造序列化字符串控制变量值。示例代码?php $KEY admin; $str $_GET[str]; if (unserialize($str) $KEY){ echo flag{test_success}; } ?Payload 构造?strs:5:admin;2. 进阶利用魔法函数写 Shell当__wakeup()或__destruct()中存在文件操作、命令执行等危险代码时可直接 GetShell。示例代码?php error_reporting(0); class Decade{ var $test 123; function __wakeup(){ $fp fopen(shell.php,w) ; fwrite($fp,$this-test); fclose($fp); } } $class3 $_GET[test]; unserialize($class3); require shell.php; ?Payload 构造?testO:6:Decade:1:{s:4:test;s:19:?php phpinfo(); ?;}五、经典绕过技巧1.__wakeup()绕过影响版本PHP 5 5.6.25PHP 7 7.0.10绕过原理将序列化字符串中对象属性个数改为大于真实属性数即可跳过__wakeup()执行。示例原字符串O:4:User:2:{s:8:username;s:4:test;s:8:password;s:4:1234;}绕过字符串O:4:User:3:{s:8:username;s:4:test;s:8:password;s:4:1234;}2. 正则绕过号绕过很多 WAF 或过滤规则会匹配preg_match(/[oc]:\d:/i, $var)可在数字前加绕过不影响解析。示例原字符串O:4:Demo:1:{s:10:Demofile;s:16:flag.php;}绕过字符串O:4:Demo:1:{s:10:Demofile;s:16:flag.php;}六、PHP 反序列化漏洞挖掘流程定位可控点找到unserialize()函数确认参数可控寻找目标类重点找包含__wakeup()/__destruct()的类跟踪调用链分析魔法函数中使用的属性、调用的方法找到可控点构造 Payload复制目标代码伪造序列化字符串发起攻击七、总结核心本质PHP 反序列化漏洞 可控反序列化数据 危险魔法函数基础利用控制变量、直接写 Shell绕过技巧__wakeup()属性数绕过、号正则绕过

相关新闻