Bug Bounty, Bug Hunting, PostgreSQL, SQL-Injection

#18 Bug Bounty v.2 — PostgreSQL. Union Based SQL — Injection

Здравствуйте, дорогие друзья.

Как и в случае с MySQL, первым шагом является определение того, сколько столбцов использует SQL-запрос, это можно сделать с помощью оператора “order by”. Как показано ниже, мы запрашиваем сервер “есть ли у вас хотя бы один столбец”, затем спрашиваем “есть ли у вас два столбца” и так далее, пока не получим сообщение об ошибке.

Как вы можете видеть ниже, как только мы попадаем в 3 столбца, сервер выдает ошибку, это говорит нам о том, что запрос извлекает только 2 столбца.

Как показано ниже, мы можем использовать оператор “объединить все выборки” для выполнения второго запроса. Также обратите внимание, что второй выбранный столбец заключен в одинарные кавычки, это связано с тем, что типы столбцов должны соответствовать исходному запросу. Первый столбец — это целое число, а второй столбец — строка.

Примечание. Вы также можете использовать слово “null”, если не знаете тип данных, и чтобы оно выглядело следующим образом:

Union all select null,null

Если вы не смогли определить тип базы данных по сообщению об ошибке, вы всегда можете использовать функцию “version()” для вывода типа и версии базы данных, как показано ниже:

Как вы можете видеть выше, приложение работает на PostgreSQL версии 12.3. После того, как у вас есть количество столбцов, которые возвращает запрос, нам нужно найти все таблицы в базе данных. Точно так же, как в MySQL, мы можем запросить таблицу “information_schema.tables”, чтобы получить список всех таблиц в базах данных.

union all select 1,table_name from information_schema.tables wheretable_schema != ‘pg_catalog’ and table_schema != ‘information_schema’ offset 0

По большей части это то же самое, что и в MySQL, но есть несколько отличий. Для начала, в PostgreSQL нет функции group_concat, поэтому вместо этого я возвращаю по одному table_name за раз с помощью оператора “offset”. Смещение «0» возвращает первое имя таблицы, смещение «1» — второе и так далее. Я также отфильтровываю базы данных по умолчанию “pg_catalog” и “information_schema”, поскольку они, как правило, искажают результаты.

Как показано выше, вторая таблица называется “users”, это таблица, на которую мы будем ориентироваться. Следующим шагом будет извлечение столбцов, связанных с целевой таблицей, как показано ниже.

union all select 1,column_name from information_schema.columns where table_name = ‘users’ offset 0

Как показано выше, есть два интересных столбца, которые называются username и password.

Именно из этих столбцов мы будем извлекать данные, как показано в приведенном ниже запросе:

union all select 1,concat(username,’:’,password) from users offset 0

Наконец, отображаются имя пользователя и пароль первого пользователя. Затем
злоумышленник может использовать эти учетные данные для входа в приложение.

На этом все. Всем хорошего дня!

Цикл статей по Bug Bounty.