在反序列化这个对象时,为了保证队列顺序,会进行重排序的操作,而排序就涉及到大小比较,进而执行java.util.Comparator接口的compare()方法。...通过这个方法,使用者可以很方便地调用任意对象的getter,适用于在不确定JavaBean是哪个类对象时使用。...初始化时使用正经对象,且property为空,这一系列操作是为了初始化的时候不要出错。...,为了演示反序列化漏洞,增加了commons-collections依赖 前4个依赖都和项目本身有关,少了他们这个demo会出错或功能缺失。...难道没有commons-collections就无法进行反序列化利用吗?当然有。
下面是将字符串对象先进行序列化,存储到本地文件,然后再通过反序列化进行恢复 问题在于,如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象...所以这个问题的根源在于类ObjectInputStream在反序列化时,没有对生成的对象的类型做限制;假若反序列化可以设置Java类型的白名单,那么问题的影响就小了很多。...参考Matthias Kaiser在11月份的报告[1],我们以Apache Commons Collections 3为例,来解释如何构造对象,能够让程序在反序列化,即调用readObject()时,...因此,我们只需要使用前面构造的Map来构造AnnotationInvocationHandler,进行序列化,当触发readObject()反序列化的时候,就能实现命令执行。...以上解释了如何通过Apache Commons Collections 3这个库中的代码,来构造序列化对象,使得程序在反序列化时可以立即实现任意代码执行。
需要注意的是BidiMap中key和value都不可以重复; MultiMap,一个key指向的是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection...三、Collections中Map的使用示例 1. Map迭代器之mapIterator jdk中的Map接口很难进行迭代。api用户总是需要通过entryset或者keyset进行迭代。...如果不使用同步操作,当并发线程访问这个类时可能会抛出异常。...多值Map之MultiMap 所谓MultiMap,就是说单个key可以对应多个value,在put或remove时和普通Map没有区别,但当get时将返回多个value,所以返回一个collections...,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。
序列化版本)在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID 与本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,...', 'org.apache.commons.collections.functors.InstantiateTransformer', 'org.apache.commons.collections4...' 'org.apache.commons.beanutils' 若包含危险库,则使用ysoserial进行攻击复现。...所以有些防火墙工具在检测反序列化数据时仅仅检测这几个字节是不安全的设置。...但是如果使用转换后的负载就不会出现上面的问题 尝试反序列化的POP链时如果触发无法处理的异常点有可能会导致程序崩溃 如果使用某个ysoserial payload时,目标应用的响应为“ClassNotFoundException
Apache Commons Collections 反序列化漏洞payload JAVA Web反序列化漏洞的挖掘和利用 由于本人并非JAVA程序员,所以对JAVA方面的知识不是很懂...Apache commons collections包的广泛使用,也导致了java反序列化漏洞的大面积流行。...在网络上传送对象的字节序列 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。...该类可以在一个元素被加入到集合内时,自动对该元素进行特定的修饰变换,具体的变换逻辑由Transformer类定义,Transformer在TransformedMap实例化时作为参数传入。...再进行反序列化时,会执行readObject()方法,该方法会对成员变量TransformedMap的Value值进行修改,该修改触发了TransformedMap实例化时传入的参数InvokerTransformer
重写readObject方法 4.Apache Commons Collentions 5.反序列化漏洞Payload 6.Java Web 反序列化漏洞的发掘与利用 反序列化漏洞 JAVA反序列化漏洞到底是如何产生的...Apache commons collections包的广泛使用,也导致了java反序列化漏洞的大面积流行。...在网络上传送对象的字节序列 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。...该类可以在一个元素被加入到集合内时,自动对该元素进行特定的修饰变换,具体的变换逻辑由Transformer类定义,Transformer在TransformedMap实例化时作为参数传入。...再进行反序列化时,会执行readObject()方法,该方法会对成员变量TransformedMap的Value值进行修改,该修改触发了TransformedMap实例化时传入的参数InvokerTransformer
5,对属性进行显示初始化。 6,对对象进行构造代码块初始化。 7,对对象进行对应的构造函数初始化。 8,将内存地址付给栈内存中的p变量。...RMI的流程中,客户端和服务端之间传递的是一些序列化后的对象,这些对象在反序列化时,就会去寻找类。...如果某一端反序列化时发现一个对象,那么就会去自己的CLASSPATH下寻找想对应的类;如果在本地没有找到这个类,就会去远程加载codebase中的类。...然后反序列化时,就可以读取到这个信息并使用。 en。。。看了一下p神的示例代码结合类名单词的释疑感觉这就是一个用于附带一些用于解释或者额外需要的数据吧。...改动后,不再直接使用反序列化得到的Map对象,而是新建了一个linkedHashMap对象,并将原来的键值添加进去。
下面是将字符串对象先进行序列化,存储到本地文件,然后再通过反序列化进行恢复的样例代码: public static void main(String args[]) throws Exception {...所以这个问题的根源在于类ObjectInputStream在反序列化时,没有对生成的对象的类型做限制;假若反序列化可以设置Java类型的白名单,那么问题的影响就小了很多。...利用Apache Commons Collections实现远程代码执行 参考Matthias Kaiser在11月份的报告[1],我们以Apache Commons Collections 3为例,来解释如何构造对象...Commons Collections 3这个库中的代码,来构造序列化对象,使得程序在反序列化时可以立即实现任意代码执行。...确定了反序列化输入点后,再考察应用的Class Path中是否包含Apache Commons Collections库(ysoserial所支持的其他库亦可),如果是,就可以使用ysoserial来生成反序列化的
而在RMI传输数据时,数据是以序列化的形式进行传输的,这就意味着RMI调用中存在反序列化的操作,这就给了反序列化攻击可乘之机。...(除非特殊说明,否则下面说的都是8u66和CC1链) 服务端攻击注册端 服务端在向注册端使用bind等函数操作远程对象时,会提供一段序列化数据,注册端获取到序列化数据后会进行反序列化操作,这中间就会有反序列化漏洞发生可能...bind等函数操作远程对象时,会提供一段序列化数据,随后注册端也会向服务端发送一段序列化数据,服务端便会进行反序列化操作,其中便存在反序列化漏洞发生的可能。...这里先来把该攻击方法的大致轮廓勾勒出来,方便阅读下面的内容: 首先我们向注册端发送一个恶意对象 该对象能在被反序列化时主动向一个恶意注册端发起通讯并反序列化其传送过来的内容,此过程的反序列化没有经过Filter...在该readObject进行反序列化时并没有设置过滤器,所以自然而然地便绕过了RMI通讯中JEP290设置的过滤器的检测,从而可以反序列化任何恶意注册端传来的序列化流,造成反序列化攻击。
Spring的RestTemplate Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。...RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持: HttpClient OkHttp JDK原生的URLConnection(默认的) 首先注册一个RestTemplate...,传递url地址及实体类的字节码,RestTemplate会自动发起请求,接收响应,并且帮我们对响应结果进行反序列化。...dependencies> org.apache.commons...restTemplate() { // 这次我们使用了OkHttp客户端,只需要注入工厂即可 return new RestTemplate(); }
serialVersionUID简要介绍 serialVersionUID是在Java序列化、反序列化对象时起作用的一个字段。...在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常...代码演示 下面,通过实际代码,来演示对象序列化、反序列化的操作。...引入依赖 org.apache.commons 使用SerializationUtils反序列化成为对象。
Apache Commons Collections 是对 java.util.Collection 的扩展,在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。...环境准备 Windows 10 JDK版本:JDK8u71以下,这里使用的 JDK 1.7 Commons Collections版本:3.1 利用maven进行项目管理,利用IDEA创建Maven...类也实现了Transformer接口,它有一个带参构造函数,可以初始化时传入一个对象。...但怎么让它在反序列化时自动调用呢?...在前面放Transformer[]假数组的原因是:使用了Proxy代理了被修饰的Map对象时,我们在任何地方执行Map的方法时,都会触发Proxy#invoke,从而执行命令弹出计算器。
很多编程语言都提供了这一功能,但不幸的是,如果应用代码允许接受不可信的序列化数据,在进行反序列化操作时,可能会产生反序列化漏洞,黑客可以利用它进行拒绝服务攻击、访问控制攻击和远程命令执行攻击。...org.apache.commons.collections.functors.InstantiateTransformerorg.apache.commons.collections.functors.ConstantTransformerorg.apache.commons.collections.functors.ChainedTransformerorg.apache.commons.collections.functors.InvokerTransformer...但是,要从全局的角度对ObjectInputStream进行安全加固,只能使用黑名单校验,因为不太可能确定应用程序允许反序列化的所有类的清单来作为白名单,并且,这个黑名单要经常更新。...语言无关的安全反序列化方法 (1)使用纯数据格式 避免使用反序列化是减少风险的最好方式。使用纯数据格式如Json、XML,使数据对象和业务对象分离,这样减少了出现反序列化漏洞的机会。...当然,在处理纯数据时,也有可能会出现漏洞。 (2)对反序列化数据进行签名 不要反序列化不可信的数据。在序列化时,对相关的数据进行签名,对没有通过验证的数据不进行反序列化。
该类会对传入的Transformer数组进行链式调用,将前一个Transformer的执行结果当作参数传递到下一个,直至全部Transformer执行完毕后返回 // org.apache.commons.collections.functors.ChainedTransformer...手动添加新元素->触发利用链->触发漏洞 而在实际反序列化中,则需要找到一个类,并且在它进行反序列化时,**readObject**方法中也存在类似的操作 反序列化->触发readObject方法->...构造POC 尝试使用AnnotationInvocationHandler对象生成序列化数据 import org.apache.commons.collections.Transformer; import...,待序列化的对象和所有它使用的内部属性对象,必须都实现了 java.io.Serializable 接口。...使用Runtime.class时的调用链为: Runtime.class.getMethod("getRuntime").invoke(null) Runtime.class可以使用ConstantTransformer
所谓MultiMap,就是说一个key不再是简单的指向一个对象,而是一组对象,add()和remove()的 时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap...,不为空时,就会进行通过反射机制动态地调用对象的特定方法。...这符合面向对象的多态性原则,即通过父类的引用调用子类的方法时,实际执行的是子类中重写后的方法。...那如果我们可以将iConstant常量赋值为Runtime对象,那就顺利解决链子的问题了 import org.apache.commons.collections.Transformer; import...; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap
CVE-2015-4852 2015年11月6日,FoxGlove Security 安全团队的 @breenmachine 发布的一篇博客中介绍了如何利用Java反序列化和 Apache Commons...CVE-2016-3510 原理是将反序列化的对象封装进了` weblogic.corba.utils.MarshalledObject`,然后再对 `MarshalledObject `进行序列化,生成...反序列化时 `MarshalledObject` 不在 WebLogic 黑名单里,可正常反序列化,在反序列化时 `MarshalledObject `对象调用 `readObject` 时对 `MarshalledObject...` 封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。...在commons-collections.jar版本没有升级的 Weblogic 中,使用CommonsCollections 这个 payload 是可以的。
,对象的序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。...当试图对一个对象进行序列化时,如果遇到一个没有实现java.io.Serialization接口的对象时,将抛出NotSerializationException异常。...6ef64f64[ name=yaomy age=23 ] common.lang.User1@184c9860[ name= age=0 ] 通过上面的实例可以发现,对User1进行序列化然后再进行反序列化之后对象的属性都恢复成了默认值...当使用Externalizable接口来进行序列化与反序列化的时候需要开发人员重写writeExternal()与readExternal()方法。...还有一点值得注意:在使用Externalizable进行序列化的时候,在读取对象时,会调用被序列化类的无参构造器去创建一个新的对象,然后再将被保存对象的字段的值分别填充到新对象中。
6.JAVA Apache-CommonsCollections 序列化RCE漏洞分析 Apache Commons Collections序列化RCE漏洞问题主要出现在org.apache.commons.collections.Transformer...这里的outmap是已经构造好的TransformedMap,现在我们的目的是需要能让服务器端反序列化某对象时,触发outmap的checkSetValue()函数。...因此我们只需要使用前面构造的outmap来构造AnnotationInvocationHandler,进行序列化,当触发readObject()反序列化的时候,就能实现命令执行: ?...8.其他Java反序列化漏洞 根据上面的三个漏洞的简要分析,我们不难发现,Java反序列化漏洞产生的原因大多数是因为反序列化时没有进行校验,或者有些校验使用黑名单方式又被绕过,最终使得包含恶意代码的序列化对象在服务器端被反序列化执行...如何防范 有部分人使用反序列化时认为: FileInputStream fis=new FileInputStream("object"); ObjectInputStream ois
简单的来说大概有几点注意事项: 对象要实现了Serializable 接口 如果序列化和反序列化的serialVersionUID不同则反序列化失败,因为java是通过这个来进行序列化验证的。...Serializable 接口,序列化该子类对象,然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不同。...反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。....StringUtils; 13 14 /** 15 * 对象操作工具类, 继承org.apache.commons.lang3.ObjectUtils类 16 * @author ThinkGem...然后使用ObjectOutputStream(字节数组输出流)来构造一个对象输出流,表示将对象输出到字节数组输出流中。
而且,即使我们将初始化代码放在类的static块中,在defineClass时也无法被直接调用到。所以,如果我们要使用defineClass在目标机器上执行任意代码,需要想办法调用构造函数。...= null时会抛出异常,即_auxClasses不为空时不能进行序列化 private void writeObject(ObjectOutputStream os) throws IOException...; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap...SerialKiller是⼀个Java反序列化过滤器,可以通过⿊⽩名单的⽅式来限制反序列化时允许通过的类,在其第⼀个版本中,InvokerTransformer赫然在列,也就切断了CommonsCollections1...; import org.apache.commons.collections.map.LazyMap; import org.apache.commons.collections.map.TransformedMap
领取专属 10元无门槛券
手把手带您无忧上云