#16 Bug Bounty v.2 — Union Based SQL — Injection.
Здравствуйте, дорогие друзья.
Как только вы узнаете, что конечная точка уязвима для SQL-инъекции, следующим шагом будет ее использование. Сначала вам нужно выяснить, сколько столбцов использует конечная точка. Это можно сделать с помощью оператора “order by”. По сути, мы собираемся спросить сервер “есть ли у вас один столбец”, если да, то страница загрузится. Затем мы спрашиваем “есть ли у вас два столбца”, если он загружается, он загружается, и, если затем он выдает ошибку, мы знаем, что это не так.
Здесь мы видим, что страница загружается нормально, это означает, что оператор sql должен возвращать хотя бы один столбец. Просто продолжайте добавлять единицу к номеру, пока не получите сообщение об ошибке.
● Order by 1
● Order by 2
● Order by 3
● Order by 4
Если вы попробуете “order by 4”, это приведет к сбою, поэтому не должно быть 4 столбцов, что означает, что их 3, потому что “order by 4” загружается без каких-либо ошибок.
Теперь, когда вы знаете, сколько столбцов используется в sql-запросе, вам нужно выяснить, какие столбцы отображаются на странице. Нам нужно это знать, потому что нам нужен способ отображения извлекаемой информации. Для этого мы можем использовать инструкцию “union all select”. Обратите внимание, что для того, чтобы вторая инструкция select показала, что нам нужно, чтобы первый запрос ничего не возвращал, этого можно добиться, указав недопустимый идентификатор.
Обратите внимание на цифры на странице. Эти цифры относятся к столбцам, которые отображаются в интерфейсе. Посмотрите на приведенный выше пример. Я вижу цифры “2” и “3”, это столбцы, которые мы будем использовать для отображения результатов наших запросов.
Как показано выше, первое, что я обычно делаю, — это отображаю версию базы данных, это можно сделать с помощью следующей команды mysql:
● @@version
● version()
Вы можете видеть, что мы работаем с mysql версии 5.1.73, это хорошая идея, чтобы сделать запись, так как это может пригодиться позже. Извлечение версии базы данных — это круто, но как быть с конфиденциальными данными?
Чтобы извлечь данные, нам сначала нужно знать, на какие таблицы базы данных мы хотим ориентироваться, мы можем получить список таблиц с помощью следующей команды:
● Выберите * из information_schema.tables
Обратите внимание, что “information_schema.tables” — это таблица по умолчанию в mysql, которая содержит список имен таблиц. В этой таблице есть два столбца, которые нас интересуют: table_name и table_schema. Вы, вероятно, можете догадаться, что представляет собой столбец table_name. Столбец table_schema содержит имя базы данных, к которой принадлежит таблица, поэтому, если вы хотите получить таблицы только из текущей базы данных, обязательно отфильтруйте результаты с помощью оператора “where”.
● объединить все, выбрать 1,2,group_concat(имя_таблицы) из information_schema.tables, где table_schema = база данных()
Как вы можете видеть выше, мы получили список всех таблиц, принадлежащих этой базе данных. Возможно, вы заметили функцию “database()”, которая выводит текущее имя базы данных и используется для фильтрации результатов по столбцу table_schema. Возможно, вы также заметили функцию “group_concat”, которая объединяет все имена таблиц в одну строку, чтобы все они могли отображаться одновременно.
Как только вы выберете таблицу, на которую хотите настроить таргетинг, вам нужно будет получить список столбцов, принадлежащих этой таблице. Список столбцов, принадлежащих таблице, можно получить с помощью таблицы “information_schema.columns”, как показано в приведенном ниже запросе:
● объединить все, выбрать 1,2,group_concat(имя_колонки) из information_schema.columns, где имя_таблицы = «пользователи».
Как вы можете видеть выше, возвращено несколько столбцов, наиболее интересные названия столбцов — “uname” и “pass”. Последний шаг — удалить содержимое этих двух столбцов, как показано ниже:
● объединение всех выбранных 1,2,group_concat(uname,»:»,pass) пользователей
Как вы можете видеть выше, есть пользователь с именем “test” и паролем “test”. Затем мы можем использовать эти учетные данные для входа в приложение от имени этого пользователя.
На этом все. Всем хорошего дня!