Всем привет!
В сети очень много материала по внедрению SQL-инъекций, однако я скажу что стоит изучать эту тему не с внедрения, а с создания баз данных и освоения операторов SQL. Только так придёт понимание, когда знаешь всё изнутри. Самый распространённый вариант БД это MySQL, поэтому рассматривать будем именно её.
Приступим:
Рассказывать буду на примере Kali Linux, в этой ОС уже предустановлена система управления базами данных (СУБД). Если у вас другой дистрибутив, то можно проверить наличие MySQL командой mysql --version, в Кали на выходе получаете примерно следующее:
mysql Ver 15.1 Distrib 10.3.15-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Как видно база данных стоит MariaDB, это не должно смущать. MariaDB это форк MySQL, только работающая быстрее, поэтому имеет совместимость по sql-операторам.
Если MySQL не установлена на вашей оси, то это несложно сделать. Например установка на Debian 9 описана
Первое что нужно сделать, это запустить СУБД в терминале командой service mysql start
И потом подключаемся к базе. По умолчанию в Кали пользователь базы root без пароля, поэтому когда у нас спросят пасс, просто нужно нажать ENTER.
Прекрасно! Посадим Буратино за компьютер, пускай прокачает свои деревянные мозги )
Настало время создать нашу базу командой create database golden_key; Обратите внимание на точку с запятой, она обязательна и означает завершённый запрос. База создана, теперь добавим в неё пользователя таким образом:
grant all privileges on golden_key.* to buratino@localhost identified by 'papa_Karlo';
Разберём что в этой команде. Имя-базы-данных golden_key, пользователь buratino, пароль papa_Karlo, кроме этого мы наделили пользователя максимальными привилегиями.
Обновим права доступа, перезагрузив таблицу привилегий командой flush privileges; потом введём exit для выхода из СУБД. Посмотрим сработали ли наши манипуляции. Снова подключаемся к MySQL но уже под новым пользователем с паролем papa_Karlo. И получаем доступ к управлению нашей базы командой use golden_key;
Как видим всё прекрасно сработало
Теперь Буратино с полным доступом может сделать с базой "золотой ключик" всё что угодно. Применим оператор SHOW DATABASES; и выведем список баз
Здесь мы видим кроме нашей базы "golden_key" ещё присутствует "information_schema". Информационная схема information_schema является является стандартным представлением метаданных в языке SQL. То есть это некий шаблон, благодаря которому, не нужно изобретать велосипед. В information_schema содержатся сведения обо всех базах и их записях.
Тот же самый результат мы можем получить обратившись к information_schema c оператором select, то есть мы делаем выборку названия баз.
Поскольку у нас может быть множество баз,то текущею базу можно узнать таким образом:
С помощью оператора select можно сделать несколько запросов через запятую select database(),version();
Пока текущая база пустая, пора добавить в неё таблицу. Скопируйте и вставьте следующий код:
CREATE TABLE secret (
id INT NOT NULL AUTO_INCREMENT,
bitcoin_key VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Разберёмся, что это было ) Мы создали таблицу secret, в которой размещены 2 колонки(столбцы) - id и bitcoin_key. Для id мы установили auto_increment - MySQL автоматически будет увеличивать значение этого поля для каждой последующей записи. Таким образом автоматически поддерживается функция назначения уникального ID номера для каждой записи. Также обязательно нужно указать PRIMARY KEY - какой столбец использовать в качестве ключевого. А значение VARCHAR ограничивает длину записи.
Выведем название таблицы двумя способами:
Также выведем двумя способами колонки. Способов на самом деле больше.
Ну что же, теперь нужно заполнить поля в колонках. Каждое строковое значение должно быть в кавычках. Полям с опцией auto increment задавать значение не требуется. Вставим в колонку bitcoin_key таблицы secret значение поля main_top_secret_password.
INSERT INTO secret (bitcoin_key)
VALUES
("main_top_secret_password");
После создания полей сделаем выбор id и видим значение 1, хотя мы явно его не задавали. Значение появилось благодаря опции auto increment. Далее делаем выборку с помощью подстановки *. Таким образом выбираются все поля одновременно.
Добавим еще одну запись:
INSERT INTO secret (bitcoin_key)
VALUES
("cd5b1e4947e304476c788cd474fb579a");
И просмотрим содержимое полей ещё одним способом - перечисляя названия колонок для таблицы secret
Всё хорошо, но если у нас не одна тысяча записей, то вывод всех полей явно неразумен. С помощью like можно вывести любое значение по неполному названию. В данном примере мы хотим найти запись начинающуюся с main. Заключаем в кавычки main и ставим % означающий любое значение.
Также возможен вариант что у нас много записей, которые начинаются с main. Тогда мы можем уточнить поиск, если например знаем номер id.
Также полезно бывает узнать общее количество полей в базе
Вот так коротенько.
В одной статье невозможно раскрыть тему, но основной посыл - тренируйтесь сначала создавать базы/таблицы/колонки/записи/пользователей и т.д. Учитесь делать запросы у себя на локалке, и когда станет всё ясно, можно тренироваться на уязвимых машинах, и будет всё гораздо проще )
В сети очень много материала по внедрению SQL-инъекций, однако я скажу что стоит изучать эту тему не с внедрения, а с создания баз данных и освоения операторов SQL. Только так придёт понимание, когда знаешь всё изнутри. Самый распространённый вариант БД это MySQL, поэтому рассматривать будем именно её.
Приступим:
Рассказывать буду на примере Kali Linux, в этой ОС уже предустановлена система управления базами данных (СУБД). Если у вас другой дистрибутив, то можно проверить наличие MySQL командой mysql --version, в Кали на выходе получаете примерно следующее:
mysql Ver 15.1 Distrib 10.3.15-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Как видно база данных стоит MariaDB, это не должно смущать. MariaDB это форк MySQL, только работающая быстрее, поэтому имеет совместимость по sql-операторам.
Если MySQL не установлена на вашей оси, то это несложно сделать. Например установка на Debian 9 описана
Ссылка скрыта от гостей
Первое что нужно сделать, это запустить СУБД в терминале командой service mysql start
И потом подключаемся к базе. По умолчанию в Кали пользователь базы root без пароля, поэтому когда у нас спросят пасс, просто нужно нажать ENTER.
Прекрасно! Посадим Буратино за компьютер, пускай прокачает свои деревянные мозги )
Настало время создать нашу базу командой create database golden_key; Обратите внимание на точку с запятой, она обязательна и означает завершённый запрос. База создана, теперь добавим в неё пользователя таким образом:
grant all privileges on golden_key.* to buratino@localhost identified by 'papa_Karlo';
Разберём что в этой команде. Имя-базы-данных golden_key, пользователь buratino, пароль papa_Karlo, кроме этого мы наделили пользователя максимальными привилегиями.
Обновим права доступа, перезагрузив таблицу привилегий командой flush privileges; потом введём exit для выхода из СУБД. Посмотрим сработали ли наши манипуляции. Снова подключаемся к MySQL но уже под новым пользователем с паролем papa_Karlo. И получаем доступ к управлению нашей базы командой use golden_key;
Как видим всё прекрасно сработало
Теперь Буратино с полным доступом может сделать с базой "золотой ключик" всё что угодно. Применим оператор SHOW DATABASES; и выведем список баз
Здесь мы видим кроме нашей базы "golden_key" ещё присутствует "information_schema". Информационная схема information_schema является является стандартным представлением метаданных в языке SQL. То есть это некий шаблон, благодаря которому, не нужно изобретать велосипед. В information_schema содержатся сведения обо всех базах и их записях.
Тот же самый результат мы можем получить обратившись к information_schema c оператором select, то есть мы делаем выборку названия баз.
Поскольку у нас может быть множество баз,то текущею базу можно узнать таким образом:
С помощью оператора select можно сделать несколько запросов через запятую select database(),version();
Пока текущая база пустая, пора добавить в неё таблицу. Скопируйте и вставьте следующий код:
CREATE TABLE secret (
id INT NOT NULL AUTO_INCREMENT,
bitcoin_key VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Разберёмся, что это было ) Мы создали таблицу secret, в которой размещены 2 колонки(столбцы) - id и bitcoin_key. Для id мы установили auto_increment - MySQL автоматически будет увеличивать значение этого поля для каждой последующей записи. Таким образом автоматически поддерживается функция назначения уникального ID номера для каждой записи. Также обязательно нужно указать PRIMARY KEY - какой столбец использовать в качестве ключевого. А значение VARCHAR ограничивает длину записи.
Выведем название таблицы двумя способами:
Также выведем двумя способами колонки. Способов на самом деле больше.
Ну что же, теперь нужно заполнить поля в колонках. Каждое строковое значение должно быть в кавычках. Полям с опцией auto increment задавать значение не требуется. Вставим в колонку bitcoin_key таблицы secret значение поля main_top_secret_password.
INSERT INTO secret (bitcoin_key)
VALUES
("main_top_secret_password");
После создания полей сделаем выбор id и видим значение 1, хотя мы явно его не задавали. Значение появилось благодаря опции auto increment. Далее делаем выборку с помощью подстановки *. Таким образом выбираются все поля одновременно.
Добавим еще одну запись:
INSERT INTO secret (bitcoin_key)
VALUES
("cd5b1e4947e304476c788cd474fb579a");
И просмотрим содержимое полей ещё одним способом - перечисляя названия колонок для таблицы secret
Всё хорошо, но если у нас не одна тысяча записей, то вывод всех полей явно неразумен. С помощью like можно вывести любое значение по неполному названию. В данном примере мы хотим найти запись начинающуюся с main. Заключаем в кавычки main и ставим % означающий любое значение.
Также возможен вариант что у нас много записей, которые начинаются с main. Тогда мы можем уточнить поиск, если например знаем номер id.
Также полезно бывает узнать общее количество полей в базе
Вот так коротенько.
В одной статье невозможно раскрыть тему, но основной посыл - тренируйтесь сначала создавать базы/таблицы/колонки/записи/пользователей и т.д. Учитесь делать запросы у себя на локалке, и когда станет всё ясно, можно тренироваться на уязвимых машинах, и будет всё гораздо проще )