首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用readObject()反序列化一个类,并使用readObject返回的实例对从中调用它的实例进行“补贴”

使用readObject()方法可以反序列化一个类,将其从字节流中恢复为一个对象。readObject()方法返回的是一个Object类型的实例,需要将其转换为原始类的实例才能调用其方法。

在调用readObject()返回的实例之前,需要确保该实例的类已经实现了Serializable接口,否则会抛出NotSerializableException异常。Serializable接口是一个标记接口,用于标识一个类可以被序列化。

反序列化一个类的过程中,readObject()方法会读取字节流中的数据,并根据类的定义重新构造对象。这意味着反序列化的对象与原始对象是不同的实例,但它们的属性值是相同的。

在对从readObject()返回的实例进行“补贴”时,可以直接调用该实例的方法来修改其属性值或执行其他操作。例如,可以通过调用setter方法来修改实例的属性,或者调用其他业务逻辑方法来实现特定的功能。

需要注意的是,反序列化过程中可能会存在一些安全风险,因为反序列化可以执行任意代码。为了防止安全漏洞,可以采取一些措施,如限制反序列化的类路径、使用安全沙箱等。

关于反序列化的应用场景,它通常用于将对象持久化到磁盘或通过网络传输。例如,在分布式系统中,可以将对象序列化后发送给其他节点,以实现跨节点的数据传输和共享。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景来确定,可以参考腾讯云官方网站获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java-Java IO流解读之Object Serialization and Object Streams

同样,ObjectInputStream实现了ObjectInput接口,该接口定义了一种从输入流读取对象方法: readObject() 读取返回一个对象。...下面的图描述了对象流和接口API层次结构: ? ---- 哪些类型对象有资格进行序列化?...transient & static - 静态字段不是序列化,因为它属于而不是要序列化特定实例。 - 为防止某些字段被序列化,请使用关键字transient标记它们。...因此,Externalizable是为了让程序员在序列化期间对对象读写进行完全控制。 Serializable有一个Externalizable子接口,如果要自定义序列化方式,可以使用它。...当Externalizable一个实例传递给ObjectOutputStream时,会绕过默认序列化过程,会用实例writeExternal()方法。

32210

Weblogic12c T3 协议安全漫谈

根据堆栈信息,Weblogic收到POC数据后,进行分发后T3数据段部分进行了反序列化还原操作,进而产生了该漏洞入口。...原因如下: 利用 java.io.ObjectInputStream反序列化一个时会默认调用该类readObject方法。...因此我们可以操控valObj成为任意对象让其使用toString方法,这里我们选择恶意宿主是LimitFilter,原因如下: 了解到LimitFilter会被我们操作执行toString方法...返回数组依次extract返回给oTarget: this.getExtractors方法继承自AbstractCompositeExtractor,返回成员属性this.m_aExtractor...使用指定初始容量创建一个 PriorityQueue,根据指定比较器元素进行排序。

1.1K10
  • 单例与序列化那些事儿

    本文将通过实例+阅读Java源码方式介绍序列化是如何破坏单例模式,以及如何避免序列化单例破坏。 单例模式,是设计模式中最简单一种。...通过单例模式可以保证系统中一个只有一个实例而且该实例易于外界访问,从而方便实例个数控制节约系统资源。如果希望在系统中某个对象只能存在一个,单例模式是最好解决方案。...但是,单例模式真的能够实现实例唯一性吗? 答案是否定,很多人都知道使用反射可以破坏单例模式,除了反射以外,使用序列化与反序列化也同样会破坏单例。...序列化单例破坏 首先来写一个单例: code 1 ? 接下来是一个测试: code 2 ?...isInstantiable:如果一个serializable/externalizable可以在运行时被实例化,那么该方法就返回true。

    69920

    Java安全-反序列化-1-URLDNS

    readObject方法,可以读取到前面写入内容并进行处理 定义一个Person,继承java.io.Serializable接口,并重写writeObject/readObject方法 package...(message); } } 这个进行实例化,然后实例化对象进行序列化和反序列化 package com.naraku.sec.serialize; import java.io.FileInputStream...Class对象,即URLDNSClass对象,赋值给clazz后返回 这里一开始Class.forName("URLDNS")并没有找到对应对象,所以clazz == null 进入if...使用前面获取到URLDNS对象创建实例调用该实例getObject()方法 final ObjectPayload payload = payloadClass.newInstance();...反序列化 前面的简单实现例子中说了,在序列化时通过writeObject方法写入数据,可以在反序列化时通过readObject方法进行操作。

    22740

    Java安全-反序列化-2-CC

    这两条Transformer组合得到顺序为:先调用ConstantTransformer返回一个Runtime对象,然后调用InvokerTransformer,执行exec方法,参数为Calc...在实际反序列化漏洞中,需要将 上⾯最终⽣成outerMap对象变成⼀个序列化流。 在前面Demo中,需要向修饰过Map实例中添加新元素才能触发漏洞。...手动添加新元素->触发利用链->触发漏洞 而在实际反序列化中,则需要找到一个,并且在它进行序列化时,**readObject**方法中也存在类似的操作 反序列化->触发readObject方法->...,有一个if语句var7进行判断,只有在其不是null时候才会进入里面执行setValue,否则不会进入也就不会触发漏洞 那么如何让这个var7不为null呢?...函数,改动后,不再直接使用序列化得到Map对象,而是新建了一个LinkedHashMap对象,并将原来键值添加进去。

    33530

    序列化机制深入了解 | Java

    自定义序列化: 在一些特殊情况下,如果一个中包含某种特殊信息,如银行账户信息时,这是不希望将该实例变量值进行序列化,或者这个某个变量是不可被序列化,因此不希望实例遍历进行递归序列化。...当某个对象进行序列化时,系统会自动把该对象所有实例变量依次进行序列化,如果这个实例变量引用到其他对象,则被引用对象也会被序列化,如果被引用对象实例变量也引用了其他,在被引用对象也会被实例化...如果该方法返回是另一个对象,系统则会调用另一个对象writeReplace方法---直到该方法不在返回一个对象为止。程序最后将调用该对象writeObject()方法来保存该对象状态。...需要说明是:当使用这个方式反序列化时,程序首先会使用public无参构造器创建实例。...关于对象序列化,还有一下几点需要注意: 对象名,实力变量(包括基本数据类型,数组,其他对象引用)都会被序列化。方法、变量、transient实例变量都不会被序列化

    25020

    Web漏洞 | JAVA反序列化漏洞

    java.io.ObjectInputStream 代表对象输入流,它 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化一个对象,并将其返回 只有实现了 Serializable...Commons Collections 实现了一个TransformedMap,该类是Java标准数据结构Map接口一个扩展。...该类可以在一个元素被加入到集合内时,自动该元素进行特定修饰变换,具体变换逻辑由Transformer定义,Transformer在TransformedMap实例化时作为参数传入。...如果某个可序列化重写了readObject()方法,并且在readObject()中Map类型变量进行了键值修改操作,并且这个Map参数是可控,就可以实现我们攻击目标了。...再进行序列化时,会执行readObject()方法,该方法会对成员变量TransformedMapValue值进行修改,该修改触发了TransformedMap实例化时传入参数InvokerTransformer

    74810

    Effective-java-读书笔记之序列化

    .即使你确定了默认序列化形式是合适, 通常还必须提供一个readObject方法以保证约束关系和安全性.当一个对象物理表示法与它逻辑数据内容有实质性区别时, 使用默认序列化形式会有以下4个缺点...构造器必须检查其参数有效性, 并且在必要时候参数进行保护性拷贝.编写更加健壮readObject()方法指导方针:对于对象引用域必须保持为私有的, 要保护性地拷贝这些域中每个对象....这些检查动作应该跟在所有的保护性拷贝之后.如果整个对象图在被反序列化之后必须进行验证, 就应该使用ObjectInputValidation接口.无论是直接还是间接方式, 都不要调用中任何可被覆盖方法...自从Java1.5以来, 它就不再是在可序列化中维持实例控制最佳方法了.应该尽可能地使用枚举类型来实施实例控制约束条件.但是如果这不可能做到, 或者你需要一个实现了序列化实例受控, 那么你就必须提供一个...在外围中添加writeReplace方法. -> 产生代理实例.外围中添加readObject方法. -> 防止伪造.代理中提供readResolve方法, 返回一个逻辑上相当外围实例.

    34050

    Java安全之C3P0反序列化

    使用它开源项目有Hibernate、Spring等。例如在执行JDBC增删改查操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接开销就太大了。...Reference,在PoolBackedDataSource反序列化时该Reference中指定对象会被URLClassLoader远程加载实例化。...方法,并用返回结果作为参数实例一个ReferenceSerialized对象,然后将该对象返回,也就是序列化是ReferenceSerialized对象 而ReferenceSerialized实现了...对象中指定某个精心构造Factory;目标在进行lookup()操作时,会动态加载实例化Factory,接着调用factory.getObjectInstance()获取外部远程对象实例; 攻击者可以在...Factory文件构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE效果; 如果不使用URLClassLoader加载的话,就需要加载实例化本地实现了

    36640

    Java 反序列化学习

    返回一个被JVM加载后java.lang.Class对象。...(); // 已知对象 obj class // 这三种方式获取`Class`实例都是同一个实例,因为JVM每个加载`Class`只创建一个`Class`实例来表示它类型。...7、服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感,比如密码字符串等,希望该密码字段在序列化时,进行加密,而客户端如果拥有解密密钥,只有在客户端进行序列化时,才可以对密码进行读取,这样可以一定程度保证序列化对象数据安全...这可能发生在接收方使用与发送方不同版本序列化实例,而接收方版本扩展了发送方版本没有扩展。...该类可以在一个元素被加入到集合内时,自动该元素进行特定修饰变换,具体变换逻辑由 Transformer 定义,Transformer 在 TransformedMap 实例化时作为参数传入。

    1.4K40

    渗透测试笔记-4

    java.io.ObjectInputStream 代表对象输入流,它 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化一个对象,并将其返回 只有实现了 Serializable...Commons Collections 实现了一个TransformedMap,该类是Java标准数据结构Map接口一个扩展。...该类可以在一个元素被加入到集合内时,自动该元素进行特定修饰变换,具体变换逻辑由Transformer定义,Transformer在TransformedMap实例化时作为参数传入。...如果某个可序列化重写了readObject()方法,并且在readObject()中Map类型变量进行了键值修改操作,并且这个Map参数是可控,就可以实现我们攻击目标了。...再进行序列化时,会执行readObject()方法,该方法会对成员变量TransformedMapValue值进行修改,该修改触发了TransformedMap实例化时传入参数InvokerTransformer

    37830

    Java Review(三十六、IO)

    从图 3 中可以看出, 当使用节点流进行输入/输出时, 程序直接连接到实际数据源, 和实际输入/输出节点连接。 处理流则用于一个己存在进行连接或封装, 通过封装后流来实现数据读/写功能。...在一些特殊场景下, 如果一个里包含某些实例变量是敏感信息, 例如银行账户信息等, 这时不希望系统将该实例变量值进行序列化; 或者某个实例变量类型是不可序列化, 因此不希望实例变量进行递归序列化...readObject()方法负责从流中读取恢复对象实例变量, 通过重写该方法, 程序员可以完全获得序列化机制控制, 可以自主决定需要反序列化哪些实例变量, 以及如何进行序列化。...在通常情况下, readObject()方法与 writeObject()方法对应, 如果 writeObject()方法中 Java 对象实例变量进行了一些处理, 则应该在 readObjectO...方法中实例变量进行相应处理, 以便正确恢复该对象。

    87730

    深入理解 Java 反序列化漏洞

    我们看到,MyObject一个公有属性name,myObj实例化后将myObj.name赋值为了“hi”,然后序列化写入文件object: ? 然后读取object反序列化时: ?...,再把它们反序列化一个对象,并将其返回readObject()是可以重写,可以定制反序列化一些行为。...,都能够知道这个所有属性和方法;对于任意一个对象,都能够调用它任意一个方法和属性,详细内容请参考:http://ifeve.com/java-reflection/) 来调用任意函数,只需要传入方法名...因此我们只需要使用前面构造outmap来构造AnnotationInvocationHandler,进行序列化,当触发readObject()反序列化时候,就能实现命令执行: ?...然而这明显是一个很基础错误,在通过"(String)"类似方法进行强制转换之前,readObject()函数已经运行完毕,该发生已经发生了。

    8.3K21

    JAVA 序列化与反序列

    而后定义主函数,实例化对象传入name=aa,age=22,序列化main对象。...readObject代码,给予了攻击者在服务器上运行代码能力 可能形式 1、入口readObject直接调用危险函数 比如上述例子中,我们重写readObject方法,添加一个弹计算器指令 private...时进行调用 3、入口参数中包含可控,该类调用其他有危险方法readObject进行调用 4、构造函数/静态代码块等加载时隐式执行。...但它有以下优点: 1、使⽤ Java 内置构造,第三⽅库没有依赖。 2、在⽬标没有回显时候,能够通过 DNS 请求得知是否存在反序列化漏洞。 因此用它来测试反序列化漏洞是否存在是尤为合适。...可以发现当hashCode不等于-1时,直接返回hashCode,否则就会对handler进行一个hashCode方法处理,接下来跟进这个hashCode函数 可以发现对内容进行了getHostAddress

    31020

    java安全编码指南之:序列化Serialization

    简介 序列化是java中一个非常常用又会被人忽视功能,我们将对象写入文件需要序列化,同时,对象如果想要在网络上传输也需要进行序列化。...序列化在非静态上下文中声明内部类,该内部类包含封闭实例隐式非瞬态引用,从而导致其关联外部类实例序列化。 Java编译器对内部类实现在不同编译器之间可能有所不同。...所以,如果我们在构造函数或者其他方法中变量有一定约束范围的话,反序列化过程中也必须要加上这些约束,否则就会导致恶意字段范围。...singleton对象例子,我们在其中定义了一个deepCopy方法,通过序列化来对对象进行拷贝,但是拷贝出来一个对象,尽管我们定义是singleton对象,最后运行结果还是false,...因为上面的在反序列化过程中,并没有age字段进行校验,所以,恶意代码可能会生成超出范围age数据,当反序列化之后就溢出了。 怎么处理呢?

    51121

    java序列化学习笔记

    实现Java对象序列化与反序列化方法 假定一个Student,它对象需要序列化,可以有如下三种方法: 方法一:若Student仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化...ObjectOutputStream采用默认序列化方式,Student对象非 transient实例变量进行序列化。...ObjcetInputStream采用默认序列化方式,Student对象非transient实例变量进行序列化。...()); //读取UserInfo对象用它toString()方法,对应上边第三个塞进去东西,一个UserInfo对象 UserInfo user=(UserInfo)(in.readObject...另外,使用Externalizable进行序列化时,当读取对象时,会调用被序列化无参构造器去创建一个对象,然后再将被保存对象字段值分别填充到新对象中。

    82760

    JAVA安全基础入门篇

    1、进行实例化(实例化对象) 2、获取方法 3、执行方法 接下来分步进行。...该方法进行简单解释,此方法可以实例化对象,触发构造方法,所以此时的话对象就创建完成了,接下来就是获取方法了。...,返回每个数据整型,该方法作用是每次读取流中一个字节,如果需要读取流中所有数据,需要使用循环读取。...而后main方法进行实例化对象调用了serialize方法 接下来再自定义一下反序列化函数,反序列化序列化相反即可,把Output换成Input,把write改为read,具体代码如下 package...但它有以下优点: 1、使⽤ Java 内置构造,第三⽅库没有依赖。 2、在⽬标没有回显时候,能够通过 DNS 请求得知是否存在反序列化漏洞。 因此用它来测试反序列化漏洞是否存在是尤为合适

    46950

    渗透测试 Java架构执行漏洞检测

    向其传递表示请求和响应对象 Servlet实例使用请求对象得到客户端请求信息,然后进行相应处理 Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web...()进入分支writeNonProxyDesc()写入描述数据 写入描述符标识 写入名 写入SUID (当SUID为空时,会进行计算赋值) 计算写入序列化属性标志位 写入字段信息数据 写入Block...反序列化流程 ObjectInputStream实例初始化时,读取魔术头和版本号进行校验 调用ObjectInputStream.readObject()开始读对象数据 ○读取对象类型标识 ○readOrdinaryObject...()获取调用离对象最近非■Serializable无参构造方法 (若不存在,则返回null) 创建对象实例 ■readSerialData()读取对象序列化数据 若自定义了readObject...Hook resolveClass 在使用 readObject() 反序列化时会调用 resolveClass 方法读取反序列化名,可以通过hook该方法来校验反序列化一个Demo如下 以上

    1.3K30

    Java安全之CommonsCollections1链

    ,在decorate()方法中,第一个参数为修饰Map,第二个参数和第三个参数作为一个实现Transformer接口,用来转换修饰Map键、值(为null时不进行转换);因此,当被修饰map...方法,将前一个函数transform返回结果,作为后一个函数transform参数传入。...RCE 这里以弹计算器为例,整个回链逻辑为:创建一个存放Transformer类型数组,里面包含两个对象,ConstantTransformer初始化获取Runtime对象返回;InvokeTransformer...反序列化过程需要执行对象readObject方法,也就是需要找到一个readObject方法能调用transform方法从而触发一系列回,而这个就是sun.reflect.annotation.AnnotationInvocationHandler...在TransformerMap链中,AnnotationInvocationHandlerreadObject方法中会调用Map中setValue方法从而进行一系列回,但AnnotationInvocationHandler

    42660

    Weblogic反序列化历史漏洞全汇总

    ,作用是通过反序列化,开启当前主机一个 JRMP Server ,具体利用过程是,将反序列化数据发送到 Server 中,然后Server 中进行序列化操作,开启指定端口,然后在通过 JRMPClient...0x03 前提知识 1.反射机制 JAVA反射机制是在运行状态中,对于任意一个,都能够知道这个所有属性和方法;对于任意一个对象,都能够调用它任意一个方法和属性;这种动态获取信息以及动态调用对象方法功能称为...实例化了WorkContextXmlInputAdapter,并且将获取到XML格式序列化数据传递到此类构造方法中,最后通过XMLDecoder来进行序列化操作。 ?...该类可以在一个元素被加入到集合内时,自动该元素进行特定修饰变换,具体变换逻辑由Transformer定义,Transformer在TransformedMap实例化时作为参数传入。 ?...如果某个可序列化重写了ReadObject()方法,并且在readObject()中Map类型变量进行了键值修改操作,并且这个Map变量是可控,就可以实现我们攻击目标了。

    7.6K30
    领券