总结:反序列化的一些知识点【利用反序列化要考虑回显问题即shell反弹】
序列化:把对象转换成字节流保存
反序列化:把字节流还原成对象
【序列化可以理解成一种压缩算法方便数据的传输和读取,反序列化就是对应的还原算法】
反序列化之php
原理:未对用户输入的反序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行难,sql注入,目录遍历等后果。在反序列化过程会自动触发某些魔术方法。
序列化:serialize()将对象转发成字符串
反序列化:unserialize()将字符串还原成对象
字符串格式: 对象:长度:名字:{类型:长度:名字;对象:类型:名字;}
技术:
技术上分有类和无类【即还原构造对象时,是否有创建类的过程】、
无类的话就是一个简单的数据”压缩“ ”解压缩“
有类的话就会触发一系列魔术方法
_construct()//创建对象时触发
_destruct() //对象被销毁时触发
_wakeup()//反序列化执行时
_call() //在对象上下文中调用不可访问的方法时触发
_callStatic() //在静态上下文中调用不可访问的方法时触发
_ get() //用于从不可访问的属性读取数据
_set() //用于将数据写入不可访问的属性
_isset() //在不可访问的属性上调用isset)或empty0触发
_unset() //在不可访问的属性上使用unset()时触发
_invoke()//当脚本尝试将对象调用为函数时触发
【魔术方法其实就是对象的生命流程会发生的事情和对应的自动触发的函数】
这个就是例子,通过满足下面的if条件然后利用反序列化函数unserialize构造对象然后执行魔术方法,打印处flag
然后小知识点:
一个=是赋值,俩个是比较值不比较类型(应该说会自动转换类型去比对),三个是比较类型也比较值,都相同都会返回ture
php反序列之java
ysoserial工具的使用【构造payload(这个是重点)】
java实现序列化:ObjectOutputStream类--> writeObject()
java实现反序列化:ObjectInputStream类-->readObject()