Статья 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


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

pp11

Green Team
16.09.2018
201
82
BIT
1
Класс, можно сказать получил полноценный гайд по использованию SQL запросов. Буду использовать эту тему, как пометку для себя.
 
  • Нравится
Реакции: F_ckedTurtle и explorer

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Парни, благодарю за ваши комменты и реакции. Вижу что тема зашла. Сделаю тогда скоро вторую часть. Здесь была только верхушка айсберга ) Рассмотрим ещё другие моменты, которые обязательно пригодятся в реальности.
 

iBragimoff

Green Team
09.07.2019
83
19
BIT
0
Ну не знаю. Мне как новичку в СУБД очень сложно понять данную статью, а она нацелена на новичков, как я понял. Пока читал статью, только и делал, что переписывал, а смысл команд особо и не понял. Сугубо личное мнение.
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Ну не знаю. Мне как новичку в СУБД очень сложно понять данную статью, а она нацелена на новичков, как я понял. Пока читал статью, только и делал, что переписывал, а смысл команд особо и не понял. Сугубо личное мнение.
Напишите, где не ясно, постараюсь объяснить "на пальцах". Скорее всего не ясен изначальный принцип работы базы, потому и остальное не ясно.
Вот смотрите - вы собрались позвонить, но телефон не знаете, шутка ли запомнить 200-300 номеров. Тогда вы делаете запрос в базу данных, где хранятся записи, аккуратненько разложенные по полочкам в таблице - в данном случае базой выступит телефон, а таблица это записная книжка, в которой есть поля, а в полях записи - Вася Пупкин, имена это одна колонка, номер телефона это вторая колонка. Примерно так )
 

iBragimoff

Green Team
09.07.2019
83
19
BIT
0
Напишите, где не ясно, постараюсь объяснить "на пальцах". Скорее всего не ясен изначальный принцип работы базы, потому и остальное не ясно.
Вот смотрите - вы собрались позвонить, но телефон не знаете, шутка ли запомнить 200-300 номеров. Тогда вы делаете запрос в базу данных, где хранятся записи, аккуратненько разложенные по полочкам в таблице - в данном случае базой выступит телефон, а таблица это записная книжка, в которой есть поля, а в полях записи - Вася Пупкин, имена это одна колонка, номер телефона это вторая колонка. Примерно так )
Назначение СУБД понятно, сами команды которыми вы пользуетесь не понятны. Ну раз у меня выдалась такая возможность, то допустим, вот эта команда: grant all privileges on golden_key.* to buratino@localhost identified by 'papa_Karlo'; Что за grant? Просто читая данную команду, я вижу лишь текст на английском языке не буду же я разговаривать с СУБД как с человеком только на английском, он ведь изначально заточен на команды) Спасибо за уделённое время)) Ну а так вопросов предостаточно, просто решил в краткой форме изложить.
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Можно было даже просто-напросто через переводчик перевести
grant all privileges - предоставление всех привилегий

В любом языке программирования есть так называемые зарезервированные слова/выражения. Это и есть пример команды, а не просто текст на английском.
 
  • Нравится
Реакции: dbiz и iBragimoff

iBragimoff

Green Team
09.07.2019
83
19
BIT
0
Можно было даже просто-напросто через переводчик перевести
grant all privileges - предоставление всех привилегий

В любом языке программирования есть так называемые зарезервированные слова/выражения. Это и есть пример команды, а не просто текст на английском.
Ладно, спасибо, дальше сам как-нибудь.
 

Deminig

Green Team
18.01.2019
55
7
BIT
0
Классная статья, копировать-вставить не получилось, зато научился печатать без ошибок!))
Спасибо!
 
  • Нравится
Реакции: dbiz

yr1

Green Team
10.08.2018
42
3
BIT
0
Так же по возможности интересуюсь потихоньку данным направлением. В чем заключается смысл-суть команд или слов при написании то заглавными буквами то маленькими? сдесь немного не ясно..
Спасибо за статью
Ждем вторую часть)
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Так же по возможности интересуюсь потихоньку данным направлением. В чем заключается смысл-суть команд или слов при написании то заглавными буквами то маленькими? сдесь немного не ясно..
Спасибо за статью
Ждем вторую часть)
Во второй части я написал по этому вопросу - Регистр написания не имеет значения, поэтому пишите как хотите.
 
  • Нравится
Реакции: dbiz, Dervish и yr1

aolega

New member
13.01.2020
3
0
BIT
1
Кали стоит на виртуальной машине. При вводе команд в терминал пишет:
kali@kali:~$ mysql --version
mysql Ver 15.1 Distrib 10.3.21-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
kali@kali:~$ service mysql start
bash: service: command not found
kali@kali:~$ create database golden_key;
bash: create: command not found
Как исправить?
Кстати команда man service выдаёт нормальный результат, то есть bash команду service видит .
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Кали стоит на виртуальной машине. При вводе команд в терминал пишет:
kali@kali:~$ mysql --version
mysql Ver 15.1 Distrib 10.3.21-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
kali@kali:~$ service mysql start
bash: service: command not found
kali@kali:~$ create database golden_key;
bash: create: command not found
Как исправить?
Кстати команда man service выдаёт нормальный результат, то есть bash команду service видит .

Раз версию показывает, значит с базой всё в порядке. К тому же команда одна пропущена. После service mysql start , нужно зайти сначала в базу (см. первый скриншот), прежде там чего-то создать с помощью команды sudo mysql -u root -p
Раз service mysql start не работает, проблема в том, что прав не хватает (у меня от root все сервисы запущены а у вас нет), нужно набирать sudo service mysql start

А при проблемах с башем, можно попробовать его переустановить sudo apt-get install bash
 

kirich95

One Level
22.07.2021
1
2
BIT
1
У кого 8 версия сервера. Столкнулся с ошибкой в команде "grant all privileges on golden_key.* to buratino@localhost identified by 'papa_Karlo';"
В интернете нашел выход из ситуации:
В MySQL 8 запретили делать автоматическое создание юзера командой GRANT.
Теперь нужно сначала явно создать юзера командой:

CREATE USER buratino@localhost IDENTIFIED BY 'papa_Karlo';


и только затем давать ему права:
GRANT ALL PRIVELEGIES ON golden_key.* to buratino@localhost
 
  • Нравится
Реакции: zaqwer3d и StripedBear
Мы в соцсетях:

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