深入解析 Getter 方法的安全风险:源点调用与 JDBC 攻击
真爱和自由 历史精选 220浏览 · 2025-03-21 13:52

从 getter 到 JDBC 的调用总结

前言

getter 方法也是我们熟悉的老朋友了,因为 source 点调用 getter 的非常非常常见,而且 jdbc 的攻击方法也是很妙,这里对见过的做一个总结

如何触发 getter

如何触发 getter 方法呢?这个就太多了,简单举一些常见的例子

Rome 反序列化

需要依赖

代码例子

这里以常见的 TemplatesImpl 为例子

我们简单调试分析一下

调用栈

关键在于 ToStringBean 类



获取我们的对象后进行进入 toString 方法

循环调用它的 getter 方法





CB 链子

需要

调用栈

关键点在于 compare:163, BeanComparator (org.apache.commons.beanutils)









最后反射调用



Hibernate 反序列化

这个依赖比较少见



漏洞在于这个组件中有一个类

BasicPropertyAccessor



我们看到比如拿我们的 getter 方法为例,看到

getGetter--->createGetter--->getGetterOrNull---> getterMethod

可以看到就是获取全部的 getter 方法



之后触发点在他的静态类的





jackson 原生反序列化

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

主要利用的是 POJONode 的 toString 方法



主要这个代码我们看不到,也没有什么好调试的

fastjson 原生

其实和 jackson 差不多,用的是 json 的 toJSONString 方法,都差不多

JDBC 的利用

MysqlDataSource

加入我们的 mysql 依赖

POC 如下

这里是直接用https://y4tacker.github.io/2023/04/26/year/2023/4/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BA%8C/的fastjson的原生改的

首先生成一个 dns 之后的 base64 编码后的数据



然后启动 fakemysql



运行代码


成功

简单的调试分析一下

首先是从 getter 到我们的 getConnection 方法

先是获取我们传入的参数

然后进入重写的 getConnection 方法

可以看见最后调用了 mysqlDriver.connect 触发了我们的 jdbc 的连接



DriverManagerDataSource

需要 com.mchange:mchange-commons-java

POC

这里使用的是 h2 数据库的依赖,因为我们看参数的解析

跟进 createProps 方法

只接收 user 和 password



在这里进行的连接





c3p0-DriverManagerDataSource

需要我们的依赖

不管打什么连接都可以



跟进 getConnection 方法







PGSimpleDataSource

需要依赖

打这个 jdbc 有三种方法

这里使用加载远程的 xml 文件 POC

xml 文件

然后起一个服务



运行就会访问文件,然后加载

调试分析

我们的 url 就是在 getUrl 方法中拼接的

先初始化 URL 拼接,然后再拼接服务器名称和端口号,拼接数据库名称,拼接查询参数,拼接查询参数到 URL



然后最后还是一样





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