需要访问 hsqldb 静态方法但得到 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象
Posted
技术标签:
【中文标题】需要访问 hsqldb 静态方法但得到 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象【英文标题】:need to access hsqldb static method but get java.sql.SQLSyntaxErrorException: user lacks privilege or object not found 【发布时间】:2020-07-09 04:16:54 【问题描述】:我正在尝试访问 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。
不知道我做错了什么。谢谢!
【问题讨论】:
出于安全考虑,不允许使用第一种方法。第二种方法是内部使用的,不能直接调用。您能否补充您的问题并解释您想要实现的目标。 【参考方案1】:您链接到的漏洞利用指的是 HSQLDB 版本 1.8.0,该版本自 2010 年版本 2.0 发布以来已经过时。但是,安全框架的各个方面在 HyperSQL 的最新版本之前保持不变。
即使拥有 DBA 凭据的数据库用户也无法执行恰好位于数据库服务器类路径中的任意静态方法。启动数据库服务器的系统管理员可以使用带有列表的hsqldb.method_class_names
Java System 属性发出允许作为可调用过程运行的特定静态方法的允许列表。见:http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_jrt_access_control
列出的安全静态方法只能通过 DBA 凭据转换为 SQL 可调用过程。过程的 EXECUTE 权限由 DBA 授予。
HyperSQL 2.x 版通常改进了旧的安全框架,例如允许安全密码哈希算法、密码检查和保留策略,包括通过 LDAP 和其他框架进行的外部身份验证。
【讨论】:
以上是关于需要访问 hsqldb 静态方法但得到 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象的主要内容,如果未能解决你的问题,请参考以下文章
org.hsqldb.HsqlException:连接异常:连接失败:java.io.EOFException
Linux - 编译 java 文件(hsqldb)[关闭]