SQL-инъекции и объединения

В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу. Мы можем его использовать в тех случаях, когда на сайте выводится информация из запроса к базе данных, например, при поиске.

Вот пример запроса, который объединяет результаты:

SELECT * FROM table1 WHERE id = ? UNION SELECT * FROM table2

Этот запрос сработает, если в обоих таблицах выводится одинаковое количество столбцов. Иначе надо угадывать количество столбцов. Допустим, в table1 3 столбца. Но как это узнать? Можно во второй части запроса написать так:

UNION SELECT 1,2,3 FROM table2

Это выдаст нам результат: объединение первой и второй таблицы. Если бы мы ввели другое количество элементов, например:

UNION SELECT 1,2,3,4 FROM table2

То получили бы ошибку. Можно писать любые строки (обязательно в кавычках), либо цифры. Одним словом константы. Главное, чтобы они отделялись запятой. Если не будет ошибки, значит мы угадали количество столбцов. Потренируемся на следующей форме:

Ваша задача: угадать количество столбцов в table1, используя примеры, показанные выше. Запрос к БД выглядит следующим образом:

SELECT * FROM table1 WHERE id = ...

Но как угадать их названия? Для этого обычно используется функция concat_ws совместно с таблицей, которая присутствует во всех баз данных MySQL - information_schema. В ней описываются все названия таблиц и названия столбцов.

Запрос на получение всех столбцов таблицы table1 должен выглядеть как-то так:

SELECT table_name, column_name FROM information_schema.columns WHERE table_name='table1'

Чтобы посмотреть, как хранятся данные в таблице information_schema, можно ввести название таблицы в форму ниже (таблица: table1) На данном сервере стоит ограничение на вывод большого количества данных.

SELECT table_name, column_name FROM information_schema.columns WHERE table_name= "..."

Функция concat_ws позволяет объединить названия таблиц и столбцов в том случае, когда в исходной таблице в SELECT указано одно поле, и, например, мы не знаем точного названия таблицы

Поэтому, дописав к запросу UNION SELECT concat_ws(0x3a,table_name,column_name) FROM information_schema.columns, мы получим все таблицы и столбцы из БД. И уже исходя из этих данных, анализом получим необходимые нам название таблицы и названия столбцов

Попробовать и посмотреть, какие таблицы хранятся в данной БД, можно в форме ниже. Запрос к БД выглядит следующим образом:

На данном сервере стоит ограничение на вывод большого количества данных, поэтому стоит указать также условие (название таблицы: table1). И надо не забыть завершить запрос комментарием, иначе будет ошибка.

SELECT id FROM table1 WHERE login = "..."

А вообще, обычно столбцы называются так, как все привыкли, поэтому угадывание не составляет особого труда.

Если вам понравилась данная статья и вы хотите узнать больше о SQL-инъекциях на практике - можете прочитать о попытках взлома хакерского форума на вордпрес