
PoC de "DEF CON 32 - SQL Injection Isn't Dead Smuggling Queries at the Protocol Level - Paul Gerste"
Una aplicación web simple con funcionalidad de inicio de sesión. Solo los administradores pueden iniciar sesión.
Esta aplicación utiliza PostgreSQL y pgx v5.5.3 (versión vulnerable).
El atacante intenta iniciar sesión insertando maliciosamente registros en la tabla de usuarios. Sin embargo, dado que se utilizan marcadores de posición (placeholders), la inyección SQL tradicional no funciona.
Formatos de mensajes de PostgreSQL: https://www.postgresql.org/docs/17/protocol-message-formats.html
El exploit depende del formato de mensaje que pgx envía al servidor de base de datos al ejecutar SQL.
Por defecto, pgx envía una sentencia preparada con P(Parse) y luego envía los parámetros con B(Bind).
Si se establece la siguiente configuración, pgx envía la consulta interpolada con Q(Query):
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
Puede ver los mensajes reales usando tcpdump con la opción -X.
Q_simple.py: Causa desbordamiento con Q(Query). Asume que el atacante tiene conocimiento completo de la consulta que se está ejecutando (si es caja negra, se requiere fuerza bruta).Q_nop_sled.py: Causa desbordamiento con Q(Query). Tiene éxito en la explotación en 5 intentos.B_simple.py: Causa desbordamiento con B(Bind). Asume que el atacante tiene conocimiento completo de la consulta que se está ejecutando (en mi opinión, la explotación de B(Bind) es difícil en escenarios de caja negra).