PHP 7.2.25本身不自带Gadget链,链存在于项目类库或自定义代码中;需定位unserialize()可控入口,审计__destruct/__wakeup等魔术方法是否调用system、include等危险函数,并用PHPGGC等工具验证链在该版本下的有效性。

PHP 7.2.25 本身不自带 Gadget 链,Gadget 链存在于你项目所用的类库、框架或自定义代码中。这个版本的 PHP 运行时对 __wakeup 和 __destruct 的触发逻辑已相对稳定(比如修复了部分 PHP 7.1 中的绕过行为),但不会阻止你代码里已有危险调用链被利用。
从入口点开始定位可利用类
反序列化漏洞的起点一定是调用了 unserialize() 且参数可控的地方,常见位置包括:
- Session 反序列化(
session_start()+session.serialize_handler=php_serialize配置) - Cookie 或 POST 参数直接传入
unserialize($_POST['data']) - Phar 文件被当作普通文件加载(如
file_exists('phar://xxx.phar')触发反序列化) - 缓存系统(如 Redis 存储的序列化对象被读取还原)
重点审计魔术方法的调用路径
在找到 unserialize 入口后,需人工或工具扫描项目中所有定义了以下方法的类:
-
__destruct():最常用入口,对象销毁时自动触发 -
__wakeup():反序列化完成瞬间触发(注意 PHP 7.2.25 中若属性数不匹配会跳过该方法) -
__toString():当对象被当作字符串使用(如拼接、echo)时触发 -
__get()/__set():访问/赋值不可见属性时触发,常用于构造属性注入
重点关注这些方法内部是否调用了危险函数,例如:system、exec、call_user_func、file_put_contents、include、require 等。
立即学习“PHP免费学习笔记(深入)”;
借助工具快速挖掘 POP 链
手动审计效率低,推荐使用成熟工具辅助分析当前环境中的可用链:
-
PHPGGC:支持 ThinkPHP、Laravel、Monolog、SwiftMailer 等数十个主流组件,运行
php phpggc -l查看当前支持的链;指定框架和参数即可生成 payload,例如:php phpggc monolog/rce1 'phpinfo();' - PHP-Serialization-Scanner:静态扫描项目源码,识别含危险魔术方法的类及调用关系
-
GadgetInspector(Java 版,需适配):虽为 Java 工具,但其链分析思路可迁移——把每个类看作节点,把方法调用看作边,寻找从
__destruct到危险函数的可达路径
验证链是否在 PHP 7.2.25 下有效
不同 PHP 小版本对反序列化行为有细微差异,需确认三点:
- 目标类是否在 PHP 7.2.25 环境中可被自动加载(检查 autoloader 或 require 路径)
-
__wakeup是否会被跳过(若序列化字符串声明的属性数量 ≠ 类中实际声明数量,该方法将被忽略) - 链中是否使用了已被禁用的函数(如
assert在某些配置下被禁用,create_function在 7.2+ 已废弃)
建议在与目标一致的环境中搭建最小 PoC,逐层打印调用栈,确认每一步是否如期执行。



















