
PoC von "DEF CON 32 - SQL Injection Isn't Dead Smuggling Queries at the Protocol Level - Paul Gerste"
Eine einfache Webanwendung mit Login-Funktionalität. Nur Administratoren können sich anmelden.
Diese Anwendung verwendet PostgreSQL und pgx v5.5.3 (verwundbare Version).
Der Angreifer versucht, sich anzumelden, indem er böswillig Datensätze in die Benutzertabelle einfügt. Da jedoch Platzhalter verwendet werden, funktioniert traditionelle SQL-Injection nicht.
PostgreSQL Nachrichtenformate: https://www.postgresql.org/docs/17/protocol-message-formats.html
Der Exploit hängt vom Nachrichtenformat ab, das pgx bei der Ausführung von SQL an den Datenbankserver sendet.
Standardmäßig sendet pgx eine vorbereitete Anweisung mit P(Parse) und dann Parameter mit B(Bind).
Wenn die folgende Konfiguration gesetzt ist, sendet pgx die interpolierte Abfrage mit Q(Query):
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
Sie können die tatsächlichen Nachrichten mit tcpdump und der Option -X anzeigen.
Q_simple.py: Verursacht Überlauf mit Q(Query). Geht davon aus, dass der Angreifer vollständige Kenntnis der ausgeführten Abfrage hat (bei Black-Box ist Brute-Force erforderlich).Q_nop_sled.py: Verursacht Überlauf mit Q(Query). Erfolgreiche Ausnutzung innerhalb von 5 Versuchen.B_simple.py: Verursacht Überlauf mit B(Bind). Geht davon aus, dass der Angreifer vollständige Kenntnis der ausgeführten Abfrage hat (meiner Meinung nach ist die Ausnutzung von B(Bind) in Black-Box-Szenarien schwierig).