首页 > 解决方案 > 需要访问 hsqldb 静态方法但得到 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象

问题描述

我正在尝试访问 hsqldb (2.5.1) InOutUtil 类中的反序列化静态方法。当我运行它时,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 。

不知道我做错了什么。谢谢!

标签: javahsqldb

解决方案


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

  1. 即使具有 DBA 凭据的数据库用户也无法执行恰好位于数据库服务器类路径中的任意静态方法。hsqldb.method_class_names启动数据库服务器的系统管理员可以使用带有列表的 Java System 属性发出允许作为可调用过程运行的特定静态方法的允许列表。见: http: //hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_jrt_access_control

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

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


推荐阅读