PHP反序列化
通过反序列化导致参数可控
一、魔术方法
在PHP反序列化的过程中,会自动执行一些魔术方法,完整列表如下:
方法名 | 调用条件 |
---|---|
__call | 调用不可访问或不存在的方法时被调用 |
__callStatic | 调用不可访问或不存在的静态方法时被调用 |
__clone | 进行对象clone时被调用,用来调整对象的克隆行为 |
__construct | 构建对象时被调用 |
__debuginfo | 当使用var_dump()打印对象时被调用,PHP5.6 |
__destruct | 明确销毁对象,或脚本结束时被调用 |
__get | 读取不可访问或不存在的属性时被调用 |
__invoke | 当以函数方式调用对象时被调用 |
__isset | 对不可访问或不存在的属性用isset()或empty()时被调用 |
__set | 当给不可访问或不存在属性赋值时被调用 |
__set_state | 当调用var_export()导出类时,此静态方法被调用 |
__sleep | 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用 |
__toString | 当一个类被转化成字符串时被调用 |
__unset | 对不可访问或不存在的属性进行unset时被调用 |
__weakup | 当使用unserialize时被调用,可用于做些对象的初始化操作 |
二、反序列化的常用手段
1、反序列化的常见起点
- wakeup 一定会调用
- destruct 一定会调用
- toString 当一个对象被反序列化后又被当作字符串处理
2、反序列化的常见中间跳板
- toString 当一个对象被当作字符串使用
- get 读取不可访问或不存在属性时被调用
- set 当给不可访问或不存在属性赋值时被调用
- isset 对不可访问或不存在的属性调用isset()或empty()时被调用
3、反序列化的常见终点
- call 调用不可访问或不存在的方法时被调用
- call_user_func 一般php代码执行都会选择从这里开始
- call_user_func_array 一般php代码执行选择从这里开始