区别
PHP反序列化是开发者不能参与的,开发者调用serialize
函数以后,序列化的数据就已经完成了,你得到的是一个完整的对象,并不能在序列化流里新增某一个内容,如果想插入新的内容,只有将其保存在一个属性中。也就是说PHP的序列化、反序列化是一个纯内部的过程,而其_sleep
、_wakeup
魔术方法的目的就是在序列化、反序列化的前后执行一些操作。
Java反序列化的操作,很多是需要开发者深入参与的,可以发现大量的库会实现readObject
、writeObject
方法,这和_sleep
、_wakeup
很少使用是存在鲜明对比的。
Python反序列化和Java、php有个显著的区别,就是Python的反序列化过程实际上是在执行一个基于栈的虚拟机。我们可以栈上增、删对象,也可以执行一些指令,比如函数的执行等,甚至可以用这个虚拟机执行一个完整的应用程序。所以,Python的反序列化可以立即导致任意函数、命令执行漏洞,与需要gadget的php和java相比更加危险。
总结
从危害上来看,Python的反序列化危害是最大的。
从应用广度上来看,Java的反序列化是最常被用到的。
从反序列化的原理上来看,PHP和Java是类似又不尽相同的。