Java反序列化漏洞自动挖掘方法

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Java反序列化漏洞自动挖掘方法

一、序列化与反序列化


1、定义:序列化是用于将对象转换成二进制串存储,对应着 writeObject,反序列正好相反,将二进制串转换成对象,对应着 Freadobject


0a2653c851af460fa595bd959398a8f1.png


2、各编程语言都存在:


Java: java.io.Serializable接口、fastjson、jackson、gson


PHP: serialize()、 unserialize()


Python:pickle


3、使用场景


http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4s),MII等


Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMI,JMS,JND1等(\xac\Xed)


xm lXstream,XmldEcoder等(http Body:Content-type: application/xml)


json(jackson,fastjson)http请求中包含



二、Java反序列化过程


1. 对象实例化


sun.misc.Unsafe#allocateInstance


通过反射调用构造函数


0eacb84100b54626af849e6b562bf92a.png


2. 成员变量还原


Setter和getter方法


通过反射直接设置


成员变量的处理(例如:PriorityQueue)


2d65d23f6d4748949b924e4057485923.png


三、Java反序列化漏洞(PriorityQueue)


0a2653c851af460fa595bd959398a8f1.png


四、Java反序列化漏洞挖掘


1、寻找一个类,通过构造一个对象,使其在被反序列化时能执行到危险(sink)方法。


0eacb84100b54626af849e6b562bf92a.png


2、寻找一个类,存在可能的执行路径,从反序 列化入口(source)方法执行到危险(sink)方法自动化搜索)


3、构造这个对象,使危险(sink)方法参数可控。(手工打造)



五、 自动化挖掘实现


1、在静态分析中,这是一个典型的可达性分析问题。


2d65d23f6d4748949b924e4057485923.png


2、 可达性分析 - may分析:无需绘制控制流图,只需搜素调用树。


2e9b90b2ca334476abebe75bafe6eeaa.png


六、、 调用树搜索实现


1、深度优先搜索(DFS) vs 广度优先搜索(BFS)


调用路径越长,payload越难构造 ;搜索深度有限 ;等价于搜索一个n叉树(n>100)的前几层;调用链的存储


0a2653c851af460fa595bd959398a8f1.png


2、深度优先搜索(DFS)


搜索停止条件:到达指定深度;搜索到sink方法


搜索结果保存: 使用stack保存路径


0eacb84100b54626af849e6b562bf92a.png


七、搜索中的多态问题


1、由于面向对象中多态性的存在,只有在运行时 才能确定调用哪个子类的eat方法。


2d65d23f6d4748949b924e4057485923.png


2、多态的处理


构建类、接口和方法继承树(双向树)


寻找调用的方法的实现所在类的所有子类集合


在上述集合中寻找调用者类的子类的集合


这些子类中重写的方法即为所有可能调用的方法


八、路径成环


搜索到CircleChain的hashCode方法时,这个方法调用了Object#hashCode方法,寻找Object的子类会再找到CircleChain


类,形成环。


2e9b90b2ca334476abebe75bafe6eeaa.png


九、路径爆炸


以下方法的实现会造成路径爆炸


1、Java.util.List#get方法


2、Java.lang.Object#toString方法


3、java.util.Iterator#hasNext方法


0a2653c851af460fa595bd959398a8f1.png 0eacb84100b54626af849e6b562bf92a.png


十、路径爆炸成环问题解决


1. 搜索深度限制(兜底)


2. 已搜索方法缓存


1. 先缓存、后搜索


2. 缓存方法signature


4. 调用链缓存


2d65d23f6d4748949b924e4057485923.png


只需要构造C方法执行时的上下文,使其与链2一致即可


十一、Jackson反序列化漏洞挖掘


1、简介


Jackson是一个开源的Java序列化与反序列化工具,可以将java对象序列化为xml或json格式的字符串,或者反序列化回对应的对象,由于其使用简单,速度较快,且不依靠除


JDK外的其他库,被众多用户所使用。


Jackson也是Spring MVC默认的json解析库,打开多态之后,jackson会根据json中传入的类名进行反序列化


相比其他后来开发的json解析库来说,jackson有灵活的API,可以很容易根据需要进行扩展和定制。


2、Jackson历史漏洞


CVE-2017-7525:RCE


CVE-2017-17485:RCE


CVE-2018-14718:RCE


CVE-2019-12086:任意文件读取


CVE-2019-12384:RCE(要求反序列化后再序列化payload)


CVE-2019-14379:RCE (要求反序列化后再序列化)



3、Jackson反序列化过程


对象初始化:


调用类的无参初始化方法


调用包含一个基础类型参数的构造函数,并且这个参数可控


对象中成员变量赋值:


将json看成key-value对,key与field不一定一一对应。


首先看key是否存在setter方法,如果存在setter方法,则会通过反射调用setter方法


否则看在这个类中是否存在与key同名的field,如果存在,则通过反射直接赋值。


否则看是否存在对应的getter方法,且getter的返回值是Collection或者Map的子类,如果满足这个条件,则会调用这个getter方法


如果以上条件都不满足,则抛出异常


0a2653c851af460fa595bd959398a8f1.png


4、反序列化的source method


Jackson反序列化显式调用的方法:仅包含一个基本类型参数的构造函数;Setter方法;返回值是Collection或者Map的子类的getter方法;


反序列化过程中隐式调用的方法:hashCode;compare


5、Jackson反序列化的sink method


命令执行:


• java.lang.reflect.Method#invoke


• javax.naming.Context#lookup


• javax.naming.Context#bind


• java.lang.Runtime#exec


• java.lang.ProcessBuilder#ProcessBuilder


文件读取:


• java.sql.Driver#connect MySQL客户端任意文件读取


• org.xml.sax.XMLReader#parse


• javax.xml.parsers.SAXParser#parse


• javax.xml.parsers.DocumentBuilder#parse


6、Jackson反序列化漏洞搜索结果


CVE-2019-12086:


com.mysql.cj.jdbc.NonRegisteringDriver#connect(String, Properties)-->


com.mysql.cj.jdbc.admin.MiniAdmin#MiniAdmin(String, Properties)-->


com.mysql.cj.jdbc.admin.MiniAdmin#MiniAdmin(String)


CVE-2017-7525:


com.sun.jndi.toolkit.url.GenericURLContext#lookup(String)-->


javax.naming.InitialContext#lookup(String)-->


com.sun.rowset.JdbcRowSetImpl#connect()-->


com.sun.rowset.JdbcRowSetImpl#setAutoCommit(boolean)


javax.xml.parsers.SAXParser#parse(InputSource, DefaultHandler)-->


org.mortbay.xml.XmlParser#parse(InputSource)-->


org.mortbay.xml.XmlConfiguration#XmlConfiguration(String)


CVE-2019-12814


com.sun.xml.internal.fastinfoset.sax.SAXDocumentParser#parse(InputSource)-->


org.apache.xalan.processor.TransformerFactoryImpl#newTemplates(Source)-->


org.jdom.transform.XSLTransformer#XSLTransformer(Source)-->


org.jdom.transform.XSLTransformer#XSLTransformer(String)


禁止非法,后果自负

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
33 3
|
3天前
|
Java
Java 与垃圾回收有关的方法
Java 与垃圾回收有关的方法
|
3天前
|
存储 Java 测试技术
一文搞清楚Java中的方法、常量、变量、参数
在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:**常量与变量**,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。
14 0
|
8天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
23 11
|
9天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
14 0
Java接口中可以定义哪些方法?
|
12天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
14天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
24 5
|
15天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
14 0
|
17天前
|
Java
Java中关于ConditionObject的signal()方法的分析
Java中关于ConditionObject的signal()方法的分析
22 4
|
17天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
23 9