[Java安全]Java反序列化C3P0之利用URLClassLoader

C3P0是什么

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等

实现不调用构造参数创建对象

这个东西在后面利用链生成的过程中实现了,为什么ysoserial使用这个猜测是为了节省不必要的变量吧,payload更短
可以参考下这篇文章Java ReflectionFactory

利用链分析

首先是生成的过程,前面部分分割最后一个:获取来设置url与classname
在这里插入图片描述
接下来就是上面提到的如何实现不调用构造参数创建对象,接下来将对象的connectionPoolDataSource设置为payloads.C3P0内部PoolSource的对象
接下来是反序列化过程,首先恢复一个对象判断是否是IndirectlySerialized的实例,并调用Object
在这里插入图片描述
这个过程很巧妙,我们看看他的WriteObject方法,必须这里要抛出异常才能进入catch分支
在这里插入图片描述
这其中的ReferenceIndirector实现了Indirector

在这里插入图片描述

WriteObject当中调用了indirectForm
在这里插入图片描述

实现了IndirectlySerialized

在这里插入图片描述
因此是可行的,再往下接下来indirectForm里面调用了getReference方法因此为什么PoolSource实现了这个方法
在这里插入图片描述
这里简单赋值,具体是干什么的看后面readObject调用的getObject方法
在这里插入图片描述
referenceToObject把引用转化为实例
在这里插入图片描述
接下来利用URLCLassLoader加载实例化恶意类
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值