Статья SQL - прежде чем ломать базы данных

Всем привет!

В сети очень много материала по внедрению 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.

1.png


Прекрасно! Посадим Буратино за компьютер, пускай прокачает свои деревянные мозги )

buratin.jpg


Настало время создать нашу базу командой create database golden_key; Обратите внимание на точку с запятой, она обязательна и означает завершённый запрос. База создана, теперь добавим в неё пользователя таким образом:
grant all privileges on golden_key.* to buratino@localhost identified by 'papa_Karlo';
Разберём что в этой команде. Имя-базы-данных golden_key, пользователь buratino, пароль papa_Karlo, кроме этого мы наделили пользователя максимальными привилегиями.

2.png


Обновим права доступа, перезагрузив таблицу привилегий командой flush privileges; потом введём exit для выхода из СУБД. Посмотрим сработали ли наши манипуляции. Снова подключаемся к MySQL но уже под новым пользователем с паролем papa_Karlo. И получаем доступ к управлению нашей базы командой use golden_key;

Как видим всё прекрасно сработало

3.png


Теперь Буратино с полным доступом может сделать с базой "золотой ключик" всё что угодно. Применим оператор SHOW DATABASES; и выведем список баз

4.png


Здесь мы видим кроме нашей базы "golden_key" ещё присутствует "information_schema". Информационная схема information_schema является является стандартным представлением метаданных в языке SQL. То есть это некий шаблон, благодаря которому, не нужно изобретать велосипед. В information_schema содержатся сведения обо всех базах и их записях.

Тот же самый результат мы можем получить обратившись к information_schema c оператором select, то есть мы делаем выборку названия баз.

5.png


Поскольку у нас может быть множество баз,то текущею базу можно узнать таким образом:

6.png


С помощью оператора select можно сделать несколько запросов через запятую select database(),version();

7.png


Пока текущая база пустая, пора добавить в неё таблицу. Скопируйте и вставьте следующий код:

CREATE TABLE secret (
id INT NOT NULL AUTO_INCREMENT,
bitcoin_key VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);


8.png


Разберёмся, что это было ) Мы создали таблицу secret, в которой размещены 2 колонки(столбцы) - id и bitcoin_key. Для id мы установили auto_increment - MySQL автоматически будет увеличивать значение этого поля для каждой последующей записи. Таким образом автоматически поддерживается функция назначения уникального ID номера для каждой записи. Также обязательно нужно указать PRIMARY KEY - какой столбец использовать в качестве ключевого. А значение VARCHAR ограничивает длину записи.

Выведем название таблицы двумя способами:

9.png


Также выведем двумя способами колонки. Способов на самом деле больше.

10.png



Ну что же, теперь нужно заполнить поля в колонках. Каждое строковое значение должно быть в кавычках. Полям с опцией auto increment задавать значение не требуется. Вставим в колонку bitcoin_key таблицы secret значение поля main_top_secret_password.

INSERT INTO secret (bitcoin_key)
VALUES
("main_top_secret_password");


После создания полей сделаем выбор id и видим значение 1, хотя мы явно его не задавали. Значение появилось благодаря опции auto increment. Далее делаем выборку с помощью подстановки *. Таким образом выбираются все поля одновременно.

11.png



Добавим еще одну запись:

INSERT INTO secret (bitcoin_key)
VALUES
("cd5b1e4947e304476c788cd474fb579a");


И просмотрим содержимое полей ещё одним способом - перечисляя названия колонок для таблицы secret

12.png


Всё хорошо, но если у нас не одна тысяча записей, то вывод всех полей явно неразумен. С помощью like можно вывести любое значение по неполному названию. В данном примере мы хотим найти запись начинающуюся с main. Заключаем в кавычки main и ставим % означающий любое значение.
Также возможен вариант что у нас много записей, которые начинаются с main. Тогда мы можем уточнить поиск, если например знаем номер id.

13.png


Также полезно бывает узнать общее количество полей в базе

14.png


Вот так коротенько.
В одной статье невозможно раскрыть тему, но основной посыл - тренируйтесь сначала создавать базы/таблицы/колонки/записи/пользователей и т.д. Учитесь делать запросы у себя на локалке, и когда станет всё ясно, можно тренироваться на уязвимых машинах, и будет всё гораздо проще )
 
12.12.2021
22
4
BIT
48
Всё четко и понятно, хорошо как для скрипткиди для повторения так и для новичков совсем.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!