需要访问 hsqldb 静态方法但得到 java.sql.SQLSyntaxErrorException: user lacks privilege or object not found

need to access hsqldb static method but get java.sql.SQLSyntaxErrorException: user lacks privilege or object not found

我正在尝试访问 hsqldb (2.5.1) InOutUtil class 中的反序列化静态方法。当我运行它时,java -cp hsqldb.jar:. testcode

我得到:

java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: org.hsqldb.lib.InOutUtil.deserialize
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
    at testcode.main(testcode.java:58)
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: org.hsqldb.lib.InOutUtil.deserialize
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.result.Result.getException(Unknown Source)
    ... 4 more

代码:

...

connection = DriverManager.getConnection(dburl, "sa", "");
statement = connection.createStatement();
statement.execute("call \"java.lang.System.setProperty\"('org.apache.commons.collections.enableUnsafeSerialization','true')");
statement.execute("call \"org.hsqldb.lib.InOutUtil.deserialize\"('" + my_object +"');");
    
...

这是引发异常的违规行:

statement.execute("call \"org.hsqldb.lib.InOutUtil.deserialize\"('" + my_object +"');");

我想做的是在 hsqldb 的本地实例上重现此漏洞 https://github.com/Critical-Start/Team-Ares/tree/master/CVE-2020-5902

不确定我做错了什么。谢谢!

您链接的漏洞是指 HSQLDB 1.8.0 版,该版本自 2010 年发布 2.0 版以来已过时。但是,安全框架的各个方面直到最新版本的 HyperSQL.

  1. 即使拥有 DBA 证书的数据库用户也不能执行任何恰好位于数据库服务器类路径中的任意静态方法。启动数据库服务器的系统管理员可以使用 hsqldb.method_class_names Java 系统 属性 与列表。参见:http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_jrt_access_control

  2. 然后,列出的安全静态方法只能通过 DBA 凭据转换为 SQL 可调用过程。过程的 EXECUTE 权限由 DBA 授予。

  3. 版本 2.x 的 HyperSQL 通常改进了较旧的安全框架,例如允许安全密码哈希算法、密码检查和保留策略,包括通过 LDAP 进行的外部身份验证和其他框架。