• [Todo]Java反序列化-weblogic


    占坑
    https://github.com/lightless233/Java-Unserialization-Study
    https://github.com/gyyyy/footprint/blob/master/articles/2019/about-java-serialization-and-deserialization.md

    从weblogic开始

    weblogic是什么

    中间件(Middleware),Oracle定义中间件的组成包括Web服务器、应用程序服务器、内容管理系统及支持应用程序开发和交付的类似工具,它通常基于可扩展标记语言(XML)、简单对象访问协议(SOAP)、Web服务、SOA、Web 2.0和轻量级目录访问协议(LDAP)等技术。
    Oracle WebLogic Server(WebLogic):是一个可扩展的企业级Java平台(Java EE)应用服务器。其完整实现了Java EE 5.0规范,并且支持部署多种类型的分布式应用程序。在前面Oracle融合中间件的介绍中,我们已经发现了其中贯穿着WebLogic的字眼,且Oracle融合中间件和WebLogic也是我在漏洞分析时经常混淆的。实际上WebLogic是组成Oracle融合中间件的核心。几乎所有的Oracle融合中间件产品都需要运行WebLogic Server。因此,本质上,WebLogic Server不是Oracle融合中间件,而是构建或运行Oracle融合中间件的基础,Oracle融合中间件和WebLogic密不可分却在概念上不相等。
    WebLogic Server群集由多个同时运行的WebLogic Server服务器实例组成,它们协同工作以提供更高的可伸缩性和可靠性。因为WebLogic本身就是为分布式设计的中间件,所以集群功能也是WebLogic的重要功能之一。也就有了集群间通讯和同步,WebLogic的众多安全漏洞也是基于这个特性。

    weblogic版本

    10.x的主要版本:
    Oracle WebLogic Server 10.3.6

    12.x的主要版本有:

    Oracle WebLogic Server 12.1.3 
    Oracle WebLogic Server 12.2.1
    Oracle WebLogic Server 12.2.1.1
    Oracle WebLogic Server 12.2.1.2
    Oracle WebLogic Server 12.2.1.3
    

    Oracle WebLogic Server 10.3.6支持的最低JDK版本为JDK1.6, Oracle WebLogic Server 12.1.3支持的最低JDK版本为JDK1.7,Oracle WebLogic Server 12.2.1及以上支持的最低JDK版本为JDK1.8。
    因此由于JDK的版本不同,尤其是反序列化漏洞的利用方式会略有不同。同时,不同的Oracle WebLogic Server版本依赖的组件(jar包)也不尽相同,因此不同的WebLogic版本在反序列化漏洞的利用上可能需要使用不同的Gadget链(反序列化漏洞的利用链条)。但这些技巧性的东西不是本文的重点,请参考其他文章。如果出现一些PoC在某些时候可以利用,某些时候利用不成功的情况,应考虑到这两点。

    weblogic漏洞

    WebLogic爆出的漏洞以反序列化为主,通常反序列化漏洞也最为严重,官方漏洞评分通常达到9.8。WebLogic反序列化漏洞又可以分为XMLDecoder反序列化漏洞和T3反序列化漏洞。其他漏洞诸如任意文件上传、XXE等等也时有出现。

    序列化与反序列化

    ac ed 00 05 73 72 00 11 53 65 72 69 61 6c 69 7a ....sr.. Serializ
    61 74 69 6f 6e 44 65 6d 6f d9 35 3c f7 d6 0a c6 ationDem o.5<....
    d5 02 00 02 49 00 08 69 6e 74 46 69 65 6c 64 4c ....I..i ntFieldL
    00 0b 73 74 72 69 6e 67 46 69 65 6c 64 74 00 12 ..string Fieldt..
    4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e Ljava/la ng/Strin
    67 3b 78 70 00 01 7d f1 74 00 05 67 79 79 79 79 g;xp..}. t..gyyyy

    仔细观察二进制串中的部分可读数据,我们也可以差不多分辨出该对象的一些基本内容。但同样为了手写的目的 (为什么有这个目的?原因很简单,为了不被语言环境束缚) ,以及为接下来的序列化执行流程分析做准备,我们先依次来解读一下这个二进制串中的各个元素。

    0xaced,魔术头
    0x0005,版本号 (JDK主流版本一致,下文如无特殊标注,都以JDK8u为例)
    0x73,对象类型标识 (0x7n基本上都定义了类型标识符常量,但也要看出现的位置,毕竟它们都在可见字符的范围,详见java.io.ObjectStreamConstants)
    0x72,类描述符标识
    0x0011...,类名字符串长度和值 (Java序列化中的UTF8格式标准)
    0xd9353cf7d60ac6d5,序列版本唯一标识 (serialVersionUID,简称SUID)
    0x02,对象的序列化属性标志位,如是否是Block Data模式、自定义writeObject(),Serializable、Externalizable或Enum类型等
    0x0002,类的字段个数
    0x49,整数类型签名的第一个字节,同理,之后的0x4c为字符串类型签名的第一个字节 (类型签名表示与JVM规范中的定义相同)
    0x0008...,字段名字符串长度和值,非原始数据类型的字段还会在后面加上数据类型标识、完整类型签名长度和值,如之后的0x740012...
    0x78 Block Data结束标识
    0x70 父类描述符标识,此处为null
    0x00017df1 整数字段intField的值 (Java序列化中的整数格式标准) ,非原始数据类型的字段则会按对象的方式处理,如之后的字符串字段stringField被识别为字符串类型,输出字符串类型标识、字符串长度和值
  • 相关阅读:
    S3C44b0x通用延时函数,延时time个100us函数理解
    LeetCode-058-最后一个单词的长度
    LeetCode-053-最大子序和
    LeetCode-035-搜索插入位置
    LeetCode-027-移除元素
    LeetCode-026-删除有序数组中的重复项
    LeetCode-025-K 个一组翻转链表
    LeetCode-024-两两交换链表中的节点
    LeetCode-023-合并K个升序链表
    LeetCode-021-合并两个有序链表
  • 原文地址:https://www.cnblogs.com/rookieDanny/p/13097802.html
Copyright © 2020-2023  润新知