Skip to content

JavaSec 14-令人夜不能寐的 JDBC Attack(中)

约 323 字大约 1 分钟

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,这里没有对类进行限制导致出现漏洞