- __wakeup() //将在反序列化之后立即调用(当反序列化时变量个数与实际不符是会绕过)我们可以通过一个cve来绕过:CVE-2016-7124。将Object中表示数量的字段改成比实际字段大的值即可绕过wakeup函数。条件:PHP5 < 5.6.25,PHP7 < 7.0.10,或者PHP 7.3.4
- __construct() //当对象被创建即new之前,会触发进行初始化,但在unserialize()时是不会自动调用的。
- __destruct() //在到某个对象的所有引用都被删除或者当对象被显式销毁时执行或者当所有的操作正常执行完毕之后,需要释放序列化的对象即在脚本结束时(非unset)php才会销毁引用 一般来说在脚本正常结束运行之前运行。如果抛出异常就不会调用。
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见,也就不能输出。因此保护类的变量在序列化时,前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。计算长度时\0(%00)算做一个字符。url中用%00代替。
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见,也就不能输出。因此私有类的变量在序列化时,前面都会加上\0类名\0的前缀。计算长度时\0(%00)算做一个字符。url中用%00代替。
public无标记,变量名不变。 s:2:“op”;i:2;
protected在变量名前添加标记\00*\00。 s:5:“\00*\00op”;i:2;
private在变量名前添加标记\00类名\00。s:17:“\00类名\00op”;i:2;
PHP——serialize()序列化类变量public、protected、private的区别
例题:
https://blog.csdn.net/qq_46918279/article/details/120505102
https://blog.csdn.net/bazzza/article/details/111465607