首页 > 其他分享 >一文搞懂weblogic CVE-2018-2628原理与利用

一文搞懂weblogic CVE-2018-2628原理与利用

时间:2023-02-27 17:13:22浏览次数:56  
标签:序列化 java 2628 resolveProxyClass 调用 weblogic Registry 搞懂 rmi

参考:

http://xxlegend.com/2018/06/20/CVE-2018-2628 简单复现和分析/

在CVE-2017-3248的利用中,我们用ysoserial生成了一个java.rmi.registry.Registry类型的proxy

image-20230227153027438

首先回答1个问题,这里的proxy为什么需要是java.rmi.registry.Registry类型的?

因为我们在反序列化这个proxy时,调用的是RemoteObjectInvocationHandler.readObject()(动态代理,用RemoteObjectInvocationHandler代理了Registry接口),然后调用它的父类RemoteObject.readObject()

我们看看RemoteObjectInvocationHandler是啥,看一下这个类源码中的注释

image-20230227160011352

简单说就是用于RMI的动态代理,而RMI需要一个继承了java.rmi.Remote的接口,因此这里的proxy需要是java.rmi.registry.Registry类型的(java.rmi.registry.Registry继承了java.rmi.Remote)。

image-20230227160300497

在修复补丁中,weblogic在InboundMsgAbbrevresolveProxyClass方法中使用了黑名单对反序列化类进行限制:

protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
   String[] arr$ = interfaces;
   int len$ = interfaces.length;

   for(int i$ = 0; i$ < len$; ++i$) {
      String intf = arr$[i$];
      if(intf.equals("java.rmi.registry.Registry")) {
         throw new InvalidObjectException("Unauthorized proxy deserialization");
      }
   }

   return super.resolveProxyClass(interfaces);
}

java.rmi.registry.Registry进行了过滤,那么绕过思路就比较简单了,就是找另外一个继承了java.rmi.Remote的接口即可。

可以使用java.rmi.activation.Activator进行绕过:

image-20230227161349880

同样的思路,还可以使用java.rmi.Remote其它的子接口进行绕过:

image-20230227165427818

还有另一种绕过思路,就是取消代理proxy

放一张来自https://xz.aliyun.com/t/8443的图:

20201027155452-b1e5a580-1829-1

这张图是weblogic反序列化过程中调用的函数,从图中我们可以看出,反序列化的过程中会有两个分支,一个会调用InboundMsgAbbrev.resolveProxyClass()(修复补丁所在的类),另一个会调用ObjectInputStream.resolveProxyClass(),决定走哪个分支的因素就是被反序列化的类是否是动态代理类。

因此,我们只要使被反序列化的类不被代理,即可不调用InboundMsgAbbrev.resolveProxyClass(),而调用ObjectInputStream.resolveProxyClass(),这样的话,最终仍然会正常反序列化,但绕过了修复补丁。

修改后的代码如下:

image-20230227164736732

那么,为什么在不用动态代理的情况下仍然能成功利用这个漏洞呢,我们可以看下未修改时,ysoserial.payloads.JRMPClient的利用链:

* UnicastRef.newCall(RemoteObject, Operation[], int, long)
* DGCImpl_Stub.dirty(ObjID[], long, Lease)
* DGCClient$EndpointEntry.makeDirtyCall(Set<RefEntry>, long)
* DGCClient$EndpointEntry.registerRefs(List<LiveRef>)
* DGCClient.registerRefs(Endpoint, List<LiveRef>)
* LiveRef.read(ObjectInput, boolean)
* UnicastRef.readExternal(ObjectInput)
*
* Thread.start()
* DGCClient$EndpointEntry.<init>(Endpoint)
* DGCClient$EndpointEntry.lookup(Endpoint)
* DGCClient.registerRefs(Endpoint, List<LiveRef>)
* LiveRef.read(ObjectInput, boolean)
* UnicastRef.readExternal(ObjectInput)

可以看到,它调用了UnicastRef.readExternal(),那么,在修改后的代码中,我们将要反序列化的就是一个UnicastRef,在这个类反序列化的过程中,一样会调用UnicastRef.readExternal(),因此即使不用动态代理,仍然能利用这个漏洞。

标签:序列化,java,2628,resolveProxyClass,调用,weblogic,Registry,搞懂,rmi
From: https://www.cnblogs.com/rnss/p/17160420.html

相关文章

  • 彻底搞懂React-hook链表构建原理
    写在前面的小结每一个hook函数都有对应的hook对象保存状态信息useContext是唯一一个不需要添加到hook链表的hook函数只有useEffect、useLayoutEffect以及us......
  • 我终于搞懂了async/await、promise和setTimeout的执行顺序
    从一道题目出发今天看到一道面试题,是关于async/await、promise和setTimeout的执行顺序,题目如下:asyncfunctionasync1(){console.log('async1start');awaitasync2(......
  • 一文搞懂java日志框架
    发展历史总结标准接口实现产品JCLlog4j、julSlf4jlogbacklog4j-api(log4j2)log4j-core(log4j2)发展System.out最早最简单的打印方式,不可配置日......
  • 一文搞懂Vue3中如何使用ref获取元素节点?
    一文搞懂Vue3中如何使用ref获取元素节点?会飞的猪开源网站:91huajian.cn 29人赞同了该文章​展开目录 前言虽然在Vue中......
  • 一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
    前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图......
  • 一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?
    最近经常有小伙伴问到的一些问题,比较集中的是关于CPU切换.实际用C/C++,go开发,你会特别注意内存和CPU的使用情况,那些对于CPU使用情况特别关注,或者性能特别关注的朋......
  • 一文搞懂 DevOps
    前言DevOps作为一个热门的概念,近年来频频出现在各大技术社区和媒体的文章中,备受行业大咖的追捧,也吸引了很多吃瓜群众的围观。那么,DevOps是什么呢?有人说它是一种方法,也有......
  • 搞懂 DNS
    什么是DNS一个由分层的DNS服务器实现的分布式数据库一个使得主机能够查询分布式数据库的应用层协议也就是,DNS是一个应用层协议,发送一个请求,其中包含要查询的主机......
  • 彻底搞懂同步异步与阻塞非阻塞
    上两篇文章讲过了BIO与非阻塞IO以及IO多路复用,洋洋洒洒近3万字。这篇文章我们来聊一个很简单,但是很多人往往分不清的一个问题,同步异步、阻塞非阻塞到底怎么区分?开篇先问......
  • 从原理到实战,彻底搞懂Nginx
    什么是Nginx?Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、MacOSX、AIX以及MicrosoftWindows。Nginx有自己的函数库,......