ЧАСТЬ 1 ЧАСТЬ 2
Всем привет!
Поскольку в предыдущих частях я показывал примеры на одной таблице, то упустил очень важный оператор UNION, который будет постоянно использоваться в SQL-инъекциях. Поэтому встречайте часть 3 )
Запустите сервис mysql, создайте заново базу create database golden_key; если она ещё существует, просто удалите таблицу в ней, или просто сделайте базу с любым другим названием. Теперь создадим на этот раз две таблицы.
Скопируйте код, создайте таблицу login и убедитесь что она создана
CREATE TABLE login (
id INT NOT NULL AUTO_INCREMENT,
nickname VARCHAR(100) NOT NULL,
login VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Теперь сделаем вторую таблицу passwd
CREATE TABLE passwd (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Выведем колонки, и убедимся что всё прошло как надо
Прекрасно, теперь заполним поля. Обратите внимание на то как в первой части мы добавляли 1 поле, и как сделать записи во все колонки одновременно. Заполним таблицу login - скопируйте код
INSERT INTO login (nickname,login)
VALUES
("buratino","buratino"),
("malvina","4uvixa"),
("karabas","boroda");
Теперь таблицу passwd
INSERT INTO passwd (email,password)
VALUES
("wood@mail.ru","papa_Karlo"),
("devaxa@yandex.ru","solnyshko"),
("bablo@yahoo.com","bigboss");
Проверяем, что получилось
Не забываем про разные способы вывода, вторую таблицу выведем с помощью *
Сейчас, чтобы посмотреть что у нас в двух таблицах, мы применили 2 запроса. Существует оператор UNION, который позволяет объединять запросы и выводить их одновременно. Допустим мы хотим вывести из таблицы login данные из колонок nickname и login, а также из таблицы passwd email и password.
Для этого мы пишем сразу 2 выборки SELECT и с помощью UNION объединяем 2 запроса в один. Данные у нас выводятся в порядке очерёдности запросов, то есть данные из второго запроса располагаются в колонках под первым.
SELECT nickname,login FROM login UNION SELECT email,password FROM passwd;
А теперь мы подумали, что nickname не очень-то и нужен, и захотели вывести всё тоже самое без него.
SELECT login FROM login UNION SELECT email,password FROM passwd;
Упс...! Мы получили ошибку.
В чём здесь проблема? Дело в том, что количество колонок ДО UNION и ПОСЛЕ должно быть одинаково! Как быть, если нужно всё-таки получить данные, когда количество столбцов не совпадает?
Варианты есть, вспоминаем конкатенацию. Так это операция склеивания, то мы можем склеить несколько столбцов, и это будет засчитано как 1. Привел 2 варианта, как в первой части с CONCAT и с CONCAT_WS Разница лишь в том что с CONCAT_WS разделитель необходимо указывать ДО названия колонок.
Цель достигнута, однако смотрится как-то кривовато. Есть другой способ - просто вместо недостающих колонок можно вставлять значение NULL.
SELECT login,null FROM login UNION SELECT email,password FROM passwd; Так уже приятней глазу.
Поскольку в обоих таблицах у нас есть одинаковые значения ID, то в таком случае есть ещё способ вывести 2 таблицы одновременною
SELECT * FROM login,passwd WHERE login.id = passwd.id; Здесь мы ставим условие вывода что id в таблицах login и passwd одинаковы. Что за диво? Всё так чётко и красиво!
Но если нам не нужны все данные, а только login/password? Не проблема, просто перечислите нужные колонки. А если хочется вывести данные через разделитель, используйте конкатенацию )
Ещё один оператор, который мы будем использовать в инъекциях GROUP BY, используется для группировки в запросах, можно использовать как в 1 так и в нескольких столбцах. У него много применений, но нас будет интересовать только использование этого оператора для определения количества столбцов.
Отправим такой запрос SELECT login FROM login GROUP BY 1; Вывелось тоже самое что было бы и без использования GROUP BY, так - SELECT login FROM login
А теперь повторим запрос с другим значением - 2. SELECT login FROM login GROUP BY 2;
Что здесь получилось? Мы запросили записи из одной колонки login, а оператор GROUP BY пытается заглянуть в 2 колонки. Таким образом возникает ошибка. Именно такой подход, на основе ошибок, помогает при SQL-инъекциях определить количество колонок. Ведь это сейчас мы работаем с базой, которую создали сами, и всё видим, в чужой такого не будет.
А в следующей статье я вам расскажу об одном классном ресурсе, где есть возможность потренироваться на SQL-инъекциях, и разберёмся с первым, самым простым видом инъекции, который до сих пор весьма часто встречается.
Всем привет!
Поскольку в предыдущих частях я показывал примеры на одной таблице, то упустил очень важный оператор UNION, который будет постоянно использоваться в SQL-инъекциях. Поэтому встречайте часть 3 )
Запустите сервис mysql, создайте заново базу create database golden_key; если она ещё существует, просто удалите таблицу в ней, или просто сделайте базу с любым другим названием. Теперь создадим на этот раз две таблицы.
Скопируйте код, создайте таблицу login и убедитесь что она создана
CREATE TABLE login (
id INT NOT NULL AUTO_INCREMENT,
nickname VARCHAR(100) NOT NULL,
login VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Теперь сделаем вторую таблицу passwd
CREATE TABLE passwd (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Выведем колонки, и убедимся что всё прошло как надо
Прекрасно, теперь заполним поля. Обратите внимание на то как в первой части мы добавляли 1 поле, и как сделать записи во все колонки одновременно. Заполним таблицу login - скопируйте код
INSERT INTO login (nickname,login)
VALUES
("buratino","buratino"),
("malvina","4uvixa"),
("karabas","boroda");
Теперь таблицу passwd
INSERT INTO passwd (email,password)
VALUES
("wood@mail.ru","papa_Karlo"),
("devaxa@yandex.ru","solnyshko"),
("bablo@yahoo.com","bigboss");
Проверяем, что получилось
Не забываем про разные способы вывода, вторую таблицу выведем с помощью *
Сейчас, чтобы посмотреть что у нас в двух таблицах, мы применили 2 запроса. Существует оператор UNION, который позволяет объединять запросы и выводить их одновременно. Допустим мы хотим вывести из таблицы login данные из колонок nickname и login, а также из таблицы passwd email и password.
Для этого мы пишем сразу 2 выборки SELECT и с помощью UNION объединяем 2 запроса в один. Данные у нас выводятся в порядке очерёдности запросов, то есть данные из второго запроса располагаются в колонках под первым.
SELECT nickname,login FROM login UNION SELECT email,password FROM passwd;
А теперь мы подумали, что nickname не очень-то и нужен, и захотели вывести всё тоже самое без него.
SELECT login FROM login UNION SELECT email,password FROM passwd;
Упс...! Мы получили ошибку.
В чём здесь проблема? Дело в том, что количество колонок ДО UNION и ПОСЛЕ должно быть одинаково! Как быть, если нужно всё-таки получить данные, когда количество столбцов не совпадает?
Варианты есть, вспоминаем конкатенацию. Так это операция склеивания, то мы можем склеить несколько столбцов, и это будет засчитано как 1. Привел 2 варианта, как в первой части с CONCAT и с CONCAT_WS Разница лишь в том что с CONCAT_WS разделитель необходимо указывать ДО названия колонок.
Цель достигнута, однако смотрится как-то кривовато. Есть другой способ - просто вместо недостающих колонок можно вставлять значение NULL.
SELECT login,null FROM login UNION SELECT email,password FROM passwd; Так уже приятней глазу.
Поскольку в обоих таблицах у нас есть одинаковые значения ID, то в таком случае есть ещё способ вывести 2 таблицы одновременною
SELECT * FROM login,passwd WHERE login.id = passwd.id; Здесь мы ставим условие вывода что id в таблицах login и passwd одинаковы. Что за диво? Всё так чётко и красиво!
Но если нам не нужны все данные, а только login/password? Не проблема, просто перечислите нужные колонки. А если хочется вывести данные через разделитель, используйте конкатенацию )
Ещё один оператор, который мы будем использовать в инъекциях GROUP BY, используется для группировки в запросах, можно использовать как в 1 так и в нескольких столбцах. У него много применений, но нас будет интересовать только использование этого оператора для определения количества столбцов.
Отправим такой запрос SELECT login FROM login GROUP BY 1; Вывелось тоже самое что было бы и без использования GROUP BY, так - SELECT login FROM login
А теперь повторим запрос с другим значением - 2. SELECT login FROM login GROUP BY 2;
Что здесь получилось? Мы запросили записи из одной колонки login, а оператор GROUP BY пытается заглянуть в 2 колонки. Таким образом возникает ошибка. Именно такой подход, на основе ошибок, помогает при SQL-инъекциях определить количество колонок. Ведь это сейчас мы работаем с базой, которую создали сами, и всё видим, в чужой такого не будет.
А в следующей статье я вам расскажу об одном классном ресурсе, где есть возможность потренироваться на SQL-инъекциях, и разберёмся с первым, самым простым видом инъекции, который до сих пор весьма часто встречается.