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数据库支持三种主要运行模式:

  1. 内存模式(适合测试环境)

    • 连接字符串格式:jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
    • 特点:数据不持久化,DBName可为空
  2. 嵌入式模式(持久化为文件)

    • 连接字符串格式:jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
  3. 服务模式

    • 本地连接: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 调试分析发现

通过调试发现关键差异点:

  1. Windows成功调用链

    • NativeMethodAccessorImpl.invoke0
    • DriverAdapterCPDS.getDescription
  2. 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 漏洞触发机制

  1. Mac系统

    • parentLogger参数在前,配置时报错导致程序中止
    • 后续真正触发漏洞的参数无法执行
  2. Windows系统

    • pooledConnection参数可能先于parentLogger被处理
    • pooledConnection先被处理时,漏洞成功触发

4. 漏洞利用关键点

  1. 触发参数pooledConnection是实际触发漏洞的关键参数
  2. 成功条件pooledConnection必须在parentLogger之前被处理
  3. 平台差异
    • Windows:参数处理顺序不固定,可能成功
    • Mac:参数顺序固定导致必然失败

5. 防御建议

  1. 避免使用不受信任的JDBC URL连接H2数据库
  2. 限制H2数据库的网络访问
  3. 及时更新H2数据库到已修复版本
  4. 在生产环境中避免使用H2内存模式

6. 扩展知识

H2数据库的SQL脚本操作:

  • RUNSCRIPT FROM:运行SQL脚本
  • SCRIPT:根据数据库创建SQL脚本

通过理解这些机制,可以构建更复杂的攻击载荷或防御策略。

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函数: 基本命令回显实现: 3. 漏洞利用分析 3.1 漏洞利用SQL示例 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脚本 通过理解这些机制,可以构建更复杂的攻击载荷或防御策略。