loading...
记一次POP链分析
Published in:2025-10-15 | category: PHP 反序列化

0x01前言

TP5反序列化入口都是在Windows类的析构方法,通过file_exists()函数触发__toString 魔术方法,然后以__toString为中间跳板寻找代码执行点,造成反序列化任意命令执行。有关TP5的分析可以看挖掘暗藏thinkphp中的反序列利用链这篇文章,感觉分析的思路比较好。

TP6的不同之处就是没有了Windows类,也就无法利用其中的析构方法作为反序列化入口,需要重新挖掘其他入口点。

0x02补充知识

call 调用不可访问或不存在的方法时被调用
__callStatic 调用不可访问或不存在的静态方法时被调用
__clone 进行对象clone时被调用,用来调整对象的克隆行为
__constuct 构建对象的时被调用
__debuginfo 当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
__destruct 明确销毁对象或脚本结束时被调用
___get 读取不可访问或不存在属性时被调用
__invoke 当以函数方式调用对象时被调用
__isset 对不可访问或不存在的属性调用isset()或empty()时被调用
__set 当给不可访问或不存在属性赋值时被调用
__set_state 当调用var_export()导出类时,此静态方法被调用,用__set_state的返回值做为var_export的返回值
__sleep 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__toString 当一个类被转换成字符串时被调用

__unset 对不可访问或不存在的属性进行unset时被调用
wakeup 当使用unserialize时被调用,可用于做些对象的初始化操作

0x02分析

ThinkPHP存在反序列化的漏洞利用链

查看版本

是5.1.39LTS

通过网上了解到TP5的POP链入口是Windows.php中的_destruct()函数,

看到有个removeFiles()函数,继续跳转,发现该函数的功能是当filename存在的时候,执行unlink()函数删除文件名,该变量是可控的。

跳转到file_exists()

Prev:
java反序列化链总结
Next:
主流c2代码分析(Sliver篇)
catalog
catalog