首先,我们要知道反序列化漏洞的利用条件:
1.代码中要unserialize()
2.在参数传递给unserialize()的过程是可控的
了解PHP中常用的魔术方法
__call #调用不可访问或不存在的方法时被调用 如__call($name,$args)
__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时被调用,可用于做些对象的初始化操作
CTF例题:
<?php
class start