
PoC di "DEF CON 32 - L'iniezione SQL non è morta: contrabbando di query a livello di protocollo - Paul Gerste"
Una semplice applicazione web con funzionalità di login. Solo gli amministratori possono accedere.
Questa applicazione usa PostgreSQL e pgx v5.5.3 (versione vulnerabile).
L'attaccante tenta di accedere inserendo in modo dannoso record nella tabella users. Tuttavia, poiché vengono usati i placeholder, l'SQL injection tradizionale non funziona.
Formati dei messaggi PostgreSQL: https://www.postgresql.org/docs/17/protocol-message-formats.html
L'exploit dipende dal formato dei messaggi che pgx invia al server di database quando esegue SQL.
Di default, pgx invia una prepared statement con P(Parse) e poi invia i parametri con B(Bind).
Se viene impostata la seguente configurazione, pgx invia la query interpolata con Q(Query):
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
Puoi visualizzare i messaggi effettivi usando tcpdump con l'opzione -X.
Q_simple.py: Provoca overflow con Q(Query). Presuppone che l'attaccante abbia una conoscenza completa della query eseguita (se black-box, è richiesto il bruteforce).Q_nop_sled.py: Provoca overflow con Q(Query). Riesce nello sfruttamento entro 5 tentativi.B_simple.py: Provoca overflow con B(Bind). Presuppone che l'attaccante abbia una conoscenza completa della query eseguita (a mio parere, lo sfruttamento di B(Bind) è difficile in scenari black-box).