
PoC выступления "DEF CON 32 - SQL Injection не мертва: протаскивание запросов на уровне протокола - Paul Gerste"
Простое веб-приложение с функцией входа. Войти могут только администраторы.
Это приложение использует PostgreSQL и pgx v5.5.3 (уязвимая версия).
Злоумышленник пытается войти, злонамеренно вставляя записи в таблицу users. Однако, поскольку используются плейсхолдеры, традиционная SQL-инъекция не работает.
Форматы сообщений PostgreSQL: https://www.postgresql.org/docs/17/protocol-message-formats.html
Эксплойт зависит от формата сообщения, которое pgx отправляет на сервер базы данных при выполнении SQL.
По умолчанию pgx отправляет подготовленный запрос с помощью P(Parse), а затем отправляет параметры с помощью B(Bind).
Если установлена следующая конфигурация, pgx отправляет интерполированный запрос с помощью Q(Query):
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
Вы можете просмотреть фактические сообщения с помощью tcpdump с опцией -X.
Q_simple.py: Вызывает переполнение с помощью Q(Query). Предполагается, что злоумышленник полностью знает выполняемый запрос (если black-box, требуется брутфорс).Q_nop_sled.py: Вызывает переполнение с помощью Q(Query). Успешная эксплуатация в течение 5 попыток.B_simple.py: Вызывает переполнение с помощью B(Bind). Предполагается, что злоумышленник полностью знает выполняемый запрос (по моему мнению, эксплуатация B(Bind) сложна в сценариях black-box).