如何做适合网站大小的图片,手机网站 生成,东莞大型网站建设哪家好,手机管理网站反序列化底层学习
前言
以前也是懒得学#xff0c;觉得没有必要#xff0c;学到现在发现好多东西都需要学习java的底层#xff0c;而且很多漏洞都是通过反序列化底层挖出来的#xff0c;比如weblogic的一些绕过#xff0c;我这里也主要是为了学习weblogic来学习的#…反序列化底层学习
前言
以前也是懒得学觉得没有必要学到现在发现好多东西都需要学习java的底层而且很多漏洞都是通过反序列化底层挖出来的比如weblogic的一些绕过我这里也主要是为了学习weblogic来学习的所以一些细节不关注
DEMO
import java.io.*;
public class Main {public static class Demo implements Serializable {transient String name;public Demo(String name) {this.name name;}public static void main(String[] args) throws IOException, ClassNotFoundException {Demo demo new Demo(nn0nkey);ObjectOutputStream outputStream new ObjectOutputStream(new FileOutputStream(panda.out));outputStream.writeObject(demo);outputStream.close();ObjectInputStream inputStream new ObjectInputStream(new FileInputStream(panda.out));inputStream.readObject();}}
}反序列化分析
一般我们就知道反序列化会调用readobject方法现在就好好分析一下readobject干了啥
首先判断是不是重载类型的如果不是调用Object obj readObject0(false);去恢复对象 readObject0方法会对不同的类型进行不同的处理我这里是object类型的 readOrdinaryObject(unshared)我们继续看看是怎么处理的
内部调用ObjectStreamClass desc readClassDesc(false);去读取我们的序列化流的描述信息跟进
可以看到也是按照不同的类型去处理有null引用类型代理类型class类型 我们进入到class类型
return readNonProxyDesc(unshared);
先进行一个检查是不是class类型然后实例化一个desc对象desc的信息是通过readClassDescriptor读取的 跟进readClassDescriptor 跟进readNonProxy
这个方法是真正意义上的操作
系统会先从字节流中读取类名信息name in.readUTF();其次从字节流中读取serialVersionUID的信息然后再从字节流中读取各种SC_*标记信息通过该标记信息设置对应的成员属性最后从字节流中读取每一个字段的信息这些字段信息包括TypeCode、fieldName、fieldType
这里对应的方法是在序列化时使用的writeNonProxy方法在writeNonProxy中写入的TypeCode、fieldName、fieldType在这里被读取。
然后回到我们的readNonProxyDesc封装好我的信息之后使用resolveClass(readDesc)处理为class resolveClass就是使用class.forname去加载 然后调用initNonProxy处理读取到的信息初始化
最后返回desc对象 回到readOrdinaryObject方法
关键在 做了一个判断desc.isExternalizable如果序列化的接口是Externalizable类型就进入readExternalData否则进入readSerialData
如果我们的demo对象接口类型是Serializable所以进入了readSerialData方法
readSerialData方法中用了反射进行调用反序列化对象的readObject方法 然后回到readSerialData会反射调用readResolve方法 总结
那么多read方法我们总结一下
readobject:单纯的入口点
readobject0:可以说是我们的readobject方法的具体逻辑点会跟进不同的字节流选择不同的方法去处理
readOrdinaryObject:用来处理我们的object对象类型的它用于调用序列化类中readObject、readResolve、readExternal的方法会有一些选择
readClassDesc 分发用于处理字节流中TC_CLASSDESC的方法用switch来选择需要处理的方法
readNonProxyDesc 真正用来处理字节流中的TC_CLASSDESC方法会调用resolveClass进行创建反序列化的对象
resolveClass是用Class.forName来创建对象的地方在这里可以做一个检查校验用于反序列化拦截。
readNonProxy真正读取我们描述信息的方法
参考
https://www.cnblogs.com/yyhuni/p/15127416.html
https://www.cnblogs.com/yyhuni/p/15127416.html
eadNonProxy真正读取我们描述信息的方法
参考
https://www.cnblogs.com/yyhuni/p/15127416.html
https://www.cnblogs.com/yyhuni/p/15127416.html
https://www.cnblogs.com/yyhuni/p/15127416.html