CVE-2020-36180的调试分析
字数 1426 2025-08-06 08:35:22
H2数据库漏洞CVE-2020-36180分析与利用指南
1. 漏洞概述
CVE-2020-36180是H2数据库中的一个安全漏洞,允许攻击者通过特制的JDBC URL执行任意命令。该漏洞主要影响H2数据库的特定配置方式,特别是在使用内存模式或嵌入式模式时。
2. H2数据库基础知识
2.1 H2数据库运行模式
H2数据库支持三种主要运行模式:
-
内存模式(适合测试环境)
- 连接字符串格式:
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1 - 特点:数据不持久化,DBName可为空
- 连接字符串格式:
-
嵌入式模式(持久化为文件)
- 连接字符串格式:
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
- 连接字符串格式:
-
服务模式
- 本地连接:
jdbc:h2:tcp://localhost/~/test(用户主目录) - 绝对路径:
jdbc:h2:tcp://localhost//data/test
- 本地连接:
2.2 H2自定义函数
H2支持通过SQL创建Java函数:
CREATE ALIAS 大写函数名 AS
$$
import ***;
String 函数名(type args) throw *** {
// javacode
}
$$
;
CALL 大写函数名(args)
基本命令回显实现:
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
3. 漏洞利用分析
3.1 漏洞利用SQL示例
CREATE ALIAS SHELLEXEC AS
$$
String shellexec(String cmd) throws java.io.IOException {
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
$$
;
CALL SHELLEXEC('calc.exe')
3.2 平台差异性分析
该漏洞在不同操作系统上的表现存在差异:
- Windows系统:可以直接利用,但存在不稳定性(偶尔成功/失败)
- Mac系统:会出错,需要改写组件类
3.3 调试分析发现
通过调试发现关键差异点:
-
Windows成功调用链:
NativeMethodAccessorImpl.invoke0- →
DriverAdapterCPDS.getDescription
-
Mac/Windows失败调用链:
NativeMethodAccessorImpl.invoke0- →
DriverAdapterCPDS.getParentLogger
3.4 关键参数分析
在BeanSerializerBase.serializeFields方法中:
props数组包含H2连接参数(url、description等)- 使用
prop.serializeAsField(bean, gen, provider)方法配置参数 parentLogger参数在不同系统中的位置:- Windows:位置不固定,但相对靠后
- Mac:固定在第14位
3.5 漏洞触发机制
-
Mac系统:
parentLogger参数在前,配置时报错导致程序中止- 后续真正触发漏洞的参数无法执行
-
Windows系统:
pooledConnection参数可能先于parentLogger被处理- 当
pooledConnection先被处理时,漏洞成功触发
4. 漏洞利用关键点
- 触发参数:
pooledConnection是实际触发漏洞的关键参数 - 成功条件:
pooledConnection必须在parentLogger之前被处理 - 平台差异:
- Windows:参数处理顺序不固定,可能成功
- Mac:参数顺序固定导致必然失败
5. 防御建议
- 避免使用不受信任的JDBC URL连接H2数据库
- 限制H2数据库的网络访问
- 及时更新H2数据库到已修复版本
- 在生产环境中避免使用H2内存模式
6. 扩展知识
H2数据库的SQL脚本操作:
RUNSCRIPT FROM:运行SQL脚本SCRIPT:根据数据库创建SQL脚本
通过理解这些机制,可以构建更复杂的攻击载荷或防御策略。