JavaSec 14-令人夜不能寐的 JDBC Attack - Postgresql
约 603 字大约 2 分钟
Java
2025-06-
前言
上篇说的每周写点东西还是有点理想了,在期末周加上工作显然不太能实现,不过关于写的内容有了更多想法。
计组留的时间太紧了,严重错估复习时间,希望能过。
严重的拖延症导致前言都能写两部分了,好在计组有惊无险,又是没有挂科的一个学期。
之前简单梳理了一下传统 JDBC Attack 的利用手法,关于 Postgresql 的攻击手法还有很多可以深入了解和拓展的部分。
利用方式①
环境搭建和上篇一致
第一种利用方式是针对实例化类去构造,攻击的入口点有很多,但是大部分没接触过,能力有限就只是搬运一下,分析一下最常见的一种
源头
从之前 CC 链子的经验来说,如果找到一个能实例化类,并且参数相对可控的话,rce 就有可能。
版本 42.3.0 在 Postgresql 数据库里恰好有一个ObjectFactory.instantiate
public static Object instantiate(String classname, Properties info, boolean tryString,
@Nullable String stringarg)
throws ClassNotFoundException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InstantiationException, IllegalAccessException,
InvocationTargetException {
@Nullable Object[] args = {info};
Constructor<?> ctor = null;
Class<?> cls = Class.forName(classname);
try {
ctor = cls.getConstructor(Properties.class);
} catch (NoSuchMethodException ignored) {
}
if (tryString && ctor == null) {
try {
ctor = cls.getConstructor(String.class);
args = new String[]{stringarg};
} catch (NoSuchMethodException ignored) {
}
}
if (ctor == null) {
ctor = cls.getConstructor();
args = new Object[0];
}
return ctor.newInstance(args);
}
反射拿一个 classname,先去寻找有没有参数类型为 Properties 的构造方法,如果为空就去寻找单独 String 类型的构造方法,最后去newInstance,这里没有对类进行限制导致出现漏洞,所以我们就要去寻找一个类有单独 String 类型的构造方法ClassPathXmlApplicationContext
就是一个不错的选择
ClassPathXmlApplicationContext
ClassPathXmlApplicationContext
本质上是:自动从 classpath 找到指定 XML,把 XML 里的内容(类名、属性、构造方法、依赖关系)反射实例化出来
先看下源码,所有的构造方法都会进到
setConfigLocations()
简单来说就是把你要加载的 Spring 配置文件(XML)的路径保存到容器里
refresh()
去更新配置,在经过一系列调用到 org.springframework.core.io.support.PathMatchingResourcePatternResolver#getResoure