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