一、序列化与反序列化
序列化serialize:可以理解为将对象的状态信息转换为可以存储或传输形式的过程;即将对象转化为字符串的过程,便于存储或传输;
反序列化unserialize:简单理解就是重新将字符串转化为对象的过程
可以结合游戏理解,序列化就类似于游戏的存档,将一些信息转化为字符串保存,反序列化就类似于读档
php中的相关函数-->serialize和unserialize
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
魔术方法:
1)__construct():构造函数,在对象被创建时自动调用,但是unserialize()不会自动调用;
2)__destruct():析构函数,检测到某个函数被删除时被自动调用
3)__wakeup():反序列化时会先调用该函数
二、漏洞原理
当传给unserialize()的参数用户可控时,用户就可以注入精心构造的payload,当进行反序列化时可能会触发一些魔术方法造成危害;
三、防御
四、靶场
pikachu靶场--反序列化
和解说一样
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}