通过JDBCparty 对 oracle 利用链分析
真爱和自由 历史精选 1059浏览 · 2025-01-24 05:36

通过JDBCparty 对 oracle 利用链分析

前言

前些日子打了一个软件攻防赛,其中有一个 java 题,我记得结束的时候都是 0 解来着,因为官方也没有给 wp,所以就一直没有去解决,有一天看到 n1ght 师傅发了 poc,于是又去研究了一下,文章主要对题目是思路分析,我比较好奇的是 oracle 是如何利用的

题目思路

首先观察了一下 pom.xml

对大概有个了解 然后还有一些可能利用的依赖


这里没有截完

然后就是题目代码了



一开始考虑过反序列化的地方,直接在 deserialize 的时候就触发漏洞

但是当时看题目名称,又是 JDBC,所以觉得应该是控制我们的连接参数去触发漏洞的,但是网上找了半天,都没有相关的资料,以为需要自己去挖掘,最后就放弃了,但是题目其实就是在 deserialize 的时候触发漏洞的

这里我们看到 n1ght师傅的 poc

可以看到是利用其打的 JNDI,而且是高版本的 JNDI,因为题目环境是 JDK17,具体的如何打高版本的 JNDI ,jdk17 如何绕过反射限制,网上其实有很多了,我这里主要是想了解一下 oracle 的利用链,其他多余的我就不看了

SINK 点分析

我们通过一个代码,来简单看看

运行


弹出计算器

我们来分析分析这个 sink 点

估计是 getConnection 方法触发的

跟进 getConnectionInternal 方法

就很朴实无华



这样成功的触发了漏洞

如何触发 sink 点

jackson

触发 sink 点的关键其实就是在于调用 getter 方法,那这样其实触发的方法就很多很多了,比如 n1ght 师傅的 poc



就是通过 EventListenerList 触发类的 tostirng 方法,而 POJONode 类的 tostring 方法又可以触发类的 getter 方法





运行如下代码就可以弹出计算器

参考https://xz.aliyun.com/t/12509?time__1311=GqGxuCG%3DnDlr%3DiQGkQEhOK5DOITAYx

POJONode 中不存在有 toString 方法的实现,在其父类 BaseJsonNode 中存在有,因其为一个抽象类,所以选择使用 POJONode 这个没有实现 toString 方法的类进行利用



`依次调用了toString -> InternalNodeMapper #nodeToString -> ObjectWriter.writeValueAsString方法

Bean对象序列化一个json串的使用常用的方法是writeValueAsString方法,并详细分析了,在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用

这里也是getter方法调用的成因



当然还有很多,比如 fastjson 的原生等都可以的



6 条评论
某人
表情
可输入 255