
PoC de "DEF CON 32 - SQL Injection Isn't Dead Smuggling Queries at the Protocol Level - Paul Gerste"
Uma aplicação web simples com funcionalidade de login. Apenas administradores podem fazer login.
Esta aplicação utiliza PostgreSQL e pgx v5.5.3 (versão vulnerável).
O atacante tenta fazer login inserindo maliciosamente registros na tabela de usuários. No entanto, como são utilizados placeholders, a injeção SQL tradicional não funciona.
Formatos de Mensagem do PostgreSQL: https://www.postgresql.org/docs/17/protocol-message-formats.html
O exploit depende do formato de mensagem que o pgx envia ao servidor de banco de dados ao executar SQL.
Por padrão, o pgx envia uma instrução preparada com P(Parse) e depois envia parâmetros com B(Bind).
Se a seguinte configuração for definida, o pgx envia a consulta interpolada com Q(Query):
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
Você pode visualizar as mensagens reais usando tcpdump com a opção -X.
Q_simple.py: Causa estouro com Q(Query). Assume que o atacante tem conhecimento completo da consulta sendo executada (se black-box, brute force é necessário).Q_nop_sled.py: Causa estouro com Q(Query). Obtém sucesso na exploração em até 5 tentativas.B_simple.py: Causa estouro com B(Bind). Assume que o atacante tem conhecimento completo da consulta sendo executada (na minha opinião, a exploração de B(Bind) é difícil em cenários black-box).