序列化就是将对象转换成字符串,反序列化则相反,数据的格式转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。
PHP反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,导致代码致谢,SQL注入,目录遍历等不可控后果,在反序列化过程中自动触发了某些魔术方法,当进行反序列化的时候就有可能触发对象中的一些魔术方法。
serialize():将一个对象转换成字符串
unserialize():将字符串还原成一个对象
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法。
魔术方法:
- _construct:创建对象时触发
- _destruct:对象被销毁时触发,是这个对象执行完毕后自动执行的,不需要用户写代码刻意触发
- _call:在对象上下文中调用不可访问的方法时触发
- _callStatic:在静态上下文中调用不可访问的方法时触发
- _get:用于从不可访问的属性读取数据
- _set:用于将数据写入不可访问属性
- _isset:在不可访问属性上调用isset或empty触发
- _unset:在不可访问的属性上使用unset触发
- _invoke:当脚本尝试将对象调用为函数时触发
- __wakeup:用户反序列化后自动触发
- __sleep:用户序列化的时候自动触发