Java反序列化利用链篇 | JdbcRowSetImpl利用链分析

news/2024/9/22 23:26:52

JdbcRowSetImpl利用链

前言

首先说明一下:利用链都有自己的使用场景,要根据场景进行选择不同的利用链。

JdbcRowSetImpl利用链用于fastjson反序列化漏洞中。

为什么?

因为fastjson会在反序列化类时自动调用set开头的方法(不一定是setter方法),而JdbcRowSetImpl中存在一个set开头的方法,即setAutoCommit(),该这个方法中调用了connect()方法,connect()方法返回值是Connection类,返回值是由DataSource.getConnection()产生,作用是向“数据源”发起连接(Java中的Connection接口类是用于建立与数据库之间的连接的)。而这个“数据源”是可控的。

JdbcRowSetImpl利用链分析

setAutoCommit()方法代码如下:

可以看到,当this.conn为null时,会调用connect()方法,然后赋值给this.conn。也就是说肯定会调用connect()方法执行。

connect()方法代码如下:

主要是下面这段代码:如果this.getDataSourceName()有值的时候会进入

InitialContext var1 = new InitialContext();
DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());
return this.getUsername() != null && !this.getUsername().equals("") ? var2.getConnection(this.getUsername(), this.getPassword()) : var2.getConnection();

这段代码大概意思是执行InitialContext.lookup(this.getDataSourceName())返回一个数据源对象DataSource,然后再调用getConnection()方法,返回一个Connection对象。

大概理解为:向数据源DataSource发起了获取请求。

而这个数据源DataSource是由this.getDataSourceName()决定的,那接下来看一看这个方法做了什么:

原来是返回this.dataSource值,这个值从哪来呢?

通过搜索,发现是由setDataSourceName()方法来设置,值为该方法的参数值。

接下来,看看在哪里调用了该方法:通过搜索发现并没有位置调用它。

想一下:没有地方调用,这个this.dataSource值怎么来?又怎么完成上述的过程呢?

别急,setDataSourceName()方法不刚好是“set”开头的嘛,所以可以利用fastjson反序列化来触发。

这样一来,整个思路就通了:

  • 我们想执行恶意操作,关键是如何才能成功执行DataSource.getConnection(),因为该方法结合JNDI是可以远程加载资源的(JNDI注入)。
  • 想执行这个操作,需要使用到JdbcRowSetImpl中的setAutoCommit()setDataSourceName()这两个方法。
  • 其中setAutoCommit()方法用于执行connect(),进而执行DataSource.getConnection()操作。
  • setDataSourceName()方法是为了获取到DataSource,使getConnection()可以顺利执行。
  • setAutoCommit()setDataSourceName()这两个方法,都是“set”开头的,所以fastjson在反序列化的时候,都可以自动执行。

因此fastjson反序列化漏洞是可以结合JdbcRowSetImpl来完成利用的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

torch.stack

看一下stack的直观解释,动词可以简单理解为:把……放成一堆、把……放成一摞。 torch.stack方法用于沿着一个新的维度 join(也可称为cat)一系列的张量(可以是2个张量或者是更多),它会插入一个新的维度,并让张量按照这个新的维度进行张量的cat操作。值得注意的是:张量序…

Java反序列化调用链分析系列 | URLDNS链

URLDNS链 URLDNS链是java通过反序列化发起dns请求的利用链。一般用于测试反序列化漏洞。 该链比较简单,利用链也比较短。 其中入口类为 HashMap,执行类为URLStreamHandler的hashCode()方法。 整个调用链如下: HashMap.readObject() HashMap.putVal() HashMap.hash()URL.hash…

控制请求并发数量:p-limit 源码解读

p-limit 是一个控制请求并发数量的库,他的整体代码不多,思路挺好的,很有学习价值; 举例 当我们同时发起多个请求时,一般是这样做的 Promise.all([requestFn1,requestFn2,requestFn3 ]).then(res =>{})或者 requestFn1() requestFn2() requestFn3()而使用 p-limit 限制并…

程序员职业发展之路思考:工程师的等级阶梯

德雷福斯模型:新手到专家 德雷福斯模型(Dreyfus model)是在 1980 年,Dreyfus 兄弟共同提出的技能习得模型。 它是一个技能习得的阶梯模型,也可以用来考察行业技术能手的分级。该模型由上而下分成:专家、精通者、胜任者、高级新手、新手五个等级,越到上面人数占比越少。新…

2024 人工智能学习内容

第六组思维导图:图形的认识

04. 流程控制

一、流程控制流程控制就是用来控制程序运行中各语句执行顺序的语句。基本的流程结构为:顺序结构,分支结构(或称选择结构),循环结构。顺序结构:程序自上到下执行,中间没有任何判断和跳转; 分支结构:根据条件,选择性的执行某段代码,有 if……else 和 switch……case 两…

CentOS 7 虚拟机连接网络

CentOS 7 虚拟机连接网络 检查网络 ping www.baidu.com切换 root 用户 su查看网卡名 ip addr激活网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33重启网络 service network restart

execve

目录glibc glibc execve() 执行由 pathname 指定的程序。这会导致当前正在被调用进程运行的程序被一个新程序替换,且该新程序会重新初始化栈、堆,以及(已初始化和未初始化的)数据段。