文章目录
- PHP反序列化漏洞
- 反序列化漏洞
- 什么是反序列化漏洞?
- 修改序列化后的数据,目的是什么?
- Java反序列化漏洞
- 反序列化漏洞
PHP反序列化漏洞
序列化存在的意义是为了传输数据/对象,类是无法直接进行传输的。通过序列化后转换为字符串或json等格式进行传输。
反序列化漏洞
以__开头的函数,是PHP中的魔术方法。是为了更快的响应。
类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
两个下划线
- __construct():在创建对象时自动调用
- __destruct():在销毁对象时自动调用
- __wakeup():unserialize()时会自动调用这个函数==(反序列化)==
- __sleep():serialize()时会自动调用这个函数==(序列化)==
反序列化漏洞不能通过黑盒测试查找到;只能通过白盒测试,也就是代码审计
反序列化漏洞攻击者是不可控反序列化中的任何过程的,反序列化的代码是开发者自己写的,攻击者看不到。
什么是反序列化漏洞?
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。反序列化漏洞中危险函数执行的时候参数对我们来说可控,反序列化才能成立。所以反序列化漏洞的利用条件非常苛刻。
反序列化的时候实现了函数的链式调用,在这个链式调用的函数里有一个漏洞点,并且可以控制这个漏洞点的参数
修改序列化后的数据,目的是什么?
为了满足一定的条件以后实现链式调用
Java反序列化漏洞
反序列化形成的原因:链式调用
序列化,反序列化类中的方法:
序列化:
ObjectOutputStream --> writeObject()
反序列化:
ObjectInputStream --> readObject()
反序列化漏洞
PHP的反序列化和java的反序列化是两种不同的类型,序列化和反序列化本身没有漏洞点只是为了实现数据的完整高效的传输;
PHP反序列化漏洞是由于类里面的魔术方法调用了某个函数,该函数又调用了别的函数最终执行到了危险函数的位置;
JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法。