首页 > 编程知识 正文

反序列化漏洞防御,反序列化修复的方法

时间:2023-05-04 13:32:50 阅读:14413 作者:502

3358 www.Sina.com/http://www.Sina.com /序列化是使Java对象脱离Java执行环境的手段,有效实现多平台通信、对象持久化存储

Java序列化是将Java对象转换为字节序列的过程,便于存储在内存、文件和数据库中。 ObjectOutputStream类的writeObject ()方法可以序列化。 反序列化是将字节序列返回给Java对象的过程,其中ObjectInputStream类的readObject ()方法用于反序列化。

反序列化漏洞汇总

类必须实现反序列化接口,并设置serialVersionUID以应用于不同的jvm环境。

一种名为SerializationDumper的工具,主要包括幻像标头、0xaced、TC_OBJECT:0x73、TC_CLASS:0x72、serialVersionUID、newHandle

1、概述

代码功能:

将String对象obj1序列化并写入object文件,反序列化得到对象obj2。

Object文件内容:

Ac ed 00 05是java序列化内容的条件:,编码后为rO0ABQ==

示例:

• http参数、cookie、sesion、存储方式可以考虑base64(ro0 )、压缩后的base64 (h4sl )、MII等

• Servlets HTTP、Sockets和sessionmanager中包含的协议包括JMX、RMI、JMS和JNDI (

• xml Xstream、XML解码器等(http body:content-type : application/XML ) )。

包含在Jon (奋斗的汽车,fastjson ) http请求中

特征序列化和去序列化本身没有问题。 但是,如果用户可以控制输入的非序列化数据,攻击者可以通过生成恶意输入来生成非序列化对象,然后执行在此过程中构建的任何代码。

漏洞案例:

Test.class中的MyObject类具有公共属性name,在实例化myObj后,将myObj.name分配给" hi ",并将序列写入object中。

漏洞发生在反序列化过程中,MyObject类实现序列化接口,并重新编写读取对象)函数(从源输入流读取字节序列,反序列化为对象) 这里定制的动作是打开计算机。

使用场景:

2、漏洞成因

http://www.Sina.com/http://www.Sina.com /

攻击时序图:

借用Java反序列化和Apache Commons Collections这一基础3、Weblogic反序列化漏洞汇总实现远程命令执行。 这个漏洞席卷了WebLogic、WebSphere、JBoss、Jenkins和OpenNMS的最新版本。

WLS Security组件出现漏洞,允许远程攻击者执行任意命令。 攻击者通过向TCP端口7001发送T3协议通信量,利用此漏洞来包含细化的序列化Java对象。

(T3协议在WebLogic Server与其他Java程序、客户端与其他WebLogic Server实例之间传输数据)

历史漏洞:

Apache Commons Collections是第三方基础库,扩展了Java标准库的Collection结构,并实现了转换的Map类,即Java标准数据结构Map接口的扩展将元素添加到集合中时,该类可以自动对该元素执行特定的限定转换。 特定的转换逻辑由Transformer类定义,并在TransformedMap实例化过程中作为参数传递。 (可控制的变量)

如果可序列化类在readObject (方法重写,readObject )中对Map类型的变量执行键值更改操作,并且该Map变量是可控的,则可以实现攻击目标。

我在那里找到了这个类: AnnotationInvocationHandler。 这个类的代码如下(

可以实例化AnnotationInvocationHandler类,并将成员变量memberValues指派给细化的恶意变换映射对象。 然后将其序列化,提出不安全

检测的Java应用。Java应用在进行反序列化操作时,则会触发TransformedMap的变换函数,执行预设的命令。

 

分析:https://security.tencent.com/index.php/blog/msg/97

Poc:https://github.com/fjserna/CVE-2015-7547

修复办法:

 

http://www.oracle.com/technetwork/topics/security/alert-cve-2015-4852-2763333.html

https://blogs.oracle.com/security/entry/security_alert_cve_2015_4852

 

3.2 CVE-2016-0638

漏洞位置,在readExternal位置:

 

补丁,加了一个FilteringObjectInputStream过滤接口:

 

3.3 CVE-2017-3248

根据JRMPListener来构造的,从补丁也可以看出,在resolveClass和resolveProxyClass都设置了黑名单。

 

 

3.4 CVE-2017-3506&CVE-2017-10271

概述:

CVE-2017-10271 是3506的绕过。

漏洞在WLS-WebServices这个组件中,基于WLS wsat模块,核心就是XMLDecoder的反序列化漏洞,Java 调用XMLDecoder解析XML文件的时候,存在命令执行漏洞。

当前市面上挖矿主力军。

 

案例:

xmldecoder.xml:

 

利用Java的XMLDecoder解析这个xml文件:

 

这段代码执行后,直接删除了本地的e:1.txt文件,相当于在命令行调用了cmd /c del e:1.txt命令。Jdk中的XmlDecoder反序列化能调用本地的应用,也能执行系统支持的命令。

 

漏洞分析:

漏洞出现在wls-wsat.war中,此组件使用了weblogic自带的webservices处理程序来处理SOAP请求,在weblogic.wsee.jaxws.workcontext.WorkContextServerTube

类中获取XML数据传递给XMLDecoder来解析。

 

实例化了WorkContextXmlInputAdapter类,并且将获取到的XML格式的序列化数据传递到此类的构造方法中,最后通过XMLDecoder来进行反序列化操作。

 

 

漏洞复现:

抓包:

 

工具:

java -jar WebLogic_Wls-Wsat_RCE_Exp.jar http://192.168.43.100:7001 test.jsp

 

 

http://192.168.43.100:7001/bea_wls_internal/test.jsp?password=secfree&command=cat%20/etc/passwd

 

修复:

1、建议不要用JDK中的XmlDeocder类,寻求其它更安全的xml解析工具类,考虑是否删除WLS-WebServices组件

2、官方修复:补丁限定了object,new,method,void,array等字段,限定了不能生成java 实例

 

参考:

https://github.com/Tom4t0/Tom4t0.github.io/blob/29314ca531f23e9e245bad9516c5d4e4c63756f2/_posts/2017-12-22-WebLogic%20WLS-WebServices%E7%BB%84%E4%BB%B6%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.md

3.5 CVE-2018-2628

影响版本:

Oracle WebLogic Server10.3.6.0

Oracle WebLogic Server12.2.1.2

Oracle WebLogic Server12.2.1.3

Oracle WebLogic Server12.1.3.0

 

 

漏洞分析:

1.反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2.RMI

RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。

RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache Commons Collections这类库,那么会导致远程命令执行。

RMI依赖于Java远程消息交换协议JRMP(Java Remote Messaging Protocol),该协议为java定制,要求服务端与客户端都为java编写。

3.绕过黑名单

Weblogic 中InboundMsgAbbrev 的resolveProxyClass处理rmi接口类型,因为只判断了java.rmi.registry.Registry  ,找一个其他的rmi接口绕过,比如java.rmi.activation.Activator为 RMI 对象激活提供支持。

漏洞扫描:

 

 

复现过程:

 

首先服务端监听ysoserial,上面的反射代码被集成到了ysoserial工具中的CommonsCollections 的payload中,最终依然是sun.reflect.annotation.AnnotationInvocationHandler。

 

攻击端生成payload,接口用java.rmi.registry.Registry

4、漏洞挖掘

 

基本手段:

从可控数据的反序列化或间接的反序列化接口入手,在此基础上尝试构造序列化对象。

 

首先拿到一个Java应用,需要找到一个接受外部输入的序列化对象的接收点,即反序列化漏洞的触发点。我们可以通过审计源码中对反序列化函数的调用(例如readObject())来寻找,也可以直接通过对应用交互流量进行抓包,查看流量中是否包含java序列化数据来判断,java序列化数据的特征为以标记(ac ed 00 05)开头。

 

确定了反序列化输入点后,再考察应用的Class Path中是否包含Apache Commons Collections库(ysoserial所支持的其他库亦可),如果是,就可以使用ysoserial来生成反序列化的payload,指定库名和想要执行的命令即可:

通过先前找到的传入对象方式进行对象注入,数据中载入payload,触发受影响应用中ObjectInputStream的反序列化操作,随后通过反射调用Runtime.getRunTime.exec即可完成利用。

 

 

5、防御手段5.1 weblogic防御

• 过滤T3协议,限定可连接的IP
• 设置Nginx反向代理,实现t3协议和http协议隔离
• JEP290(JDK8u121,7u131,6u141),这个机制主要是在每层反序列化过程中都加了一层黑名单处理

5.2 原生反序列化防御

• 不要反序列化不可信的数据
• 给反序列数据加密签名,并确保解密在反序列之前
• 给反序列化接口添加认证授权
• 反序列化服务只允许监听在本地或者开启相应防火墙
• 升级第三方库
• 升级JDK,JEP290

 

 

参考:

https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/#h4.2_weblogic

http://xxlegend.com/2018/04/18/CVE-2018-2628%20%E7%AE%80%E5%8D%95%E5%A4%8D%E7%8E%B0%E5%92%8C%E5%88%86%E6%9E%90/

http://pirogue.org/2017/12/29/weblogic-XMLDecoder/

https://paper.seebug.org/333/(3248)

 

 

——by Jayway

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。