反序列化漏洞:
序列化:就是把一个对象变成字符串,目的就是为了方便传输,或者保存在内存,文件(可以节省内存空间),数据库中。
反序列化:就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
反序列化漏洞产生的原理:序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了魔法函数,那么用户就可以注入精心构造的 payload。当进行反序列化或者对象销毁时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。
魔法函数有:
construct()当一个对象创建时被调用
destruct()当一个对象销毁时被调用
toString()将一个对象转换成一个字符串使用
sleep() 对象序列化之前被调用
wakeup()反序列化之前被调用
不同语言对应的序列化和反序列化函数:
php: serialize(),unserialize()
java:ObjectOutputStream.writeObject()方法可以实现序列化,ObjectInputStream.readObject()方法用于反序列化.
防护:
严格控制传入变量,严谨使用魔法函数
要点:
序列化时,只对对象的属性进行保存,而不管对象的方法
遇到过Weblogic,jboss,struts2的反序列化漏洞。