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

Всем привет!
В ПЕРВОЙ ЧАСТИ были рассмотрены некоторые приёмы и операторы. Углубимся в тему.
Стартуем сервис mysql, заходим под пользователем buratino и попробуем ввести такую команду SELECT User, Host, Password, password_expired FROM mysql.user;

1.png


Мы получили ошибку, в которой говорится что он не имеет доступа к таблице user. Почему так произошло, ведь мы ему наделили полные права. Дело в том, что права у него только на базу golden_key, а здесь запрос к базе mysql. Когда мы выводили список баз, то их было две - golden_key и information_schema. Откуда тогда взялась база mysql? Дело в том что MariaDB имеет несколько баз, и сейчас мы зайдём под root и сможем вывести полный список.

3.png


Ага, появились ещё 2 базы, которых мы ранее не видели mysql и performance_schema. База performance_schema нужна для мониторинга, диагностики, анализа, и нас она не интересует. Повторим наш запрос

2.png


Теперь всё сработало. В этой команде мы сделали выбор пользователей базы mysql, имя хоста, пароли юзеров(хранятся в хэше) и проверили срок действия паролей. В данном случае нет ограничений.
Теперь обратите внимание как сделан запрос mysql.user Мы обращаемся к базе mysql и таблице user Делается это через точку, так же мы поступали в прошлой статье - INFORMATION_SCHEMA.TABLES Регистр написания не имеет значения, поэтому пишите как хотите.

Со временем какие-то данные теряют актуальность, и базу нужно подредактировать. Чтобы сервер MySQL знал в какой базе мы редактируем, выполним уже знакомую команду USE golden_key;
Но прежде чем отредактировать, хочу показать очень полезный приём - конкатенация. Это операция склеивания. То есть мы можем вывести какие-то данные в одну строку. Отправим запрос SELECT concat(id,0x3a,bitcoin_key) FROM secret;

4.png


Здесь мы объединили значения из колонок id и bitcoin_key, используя в качестве разделителя двоеточие. Такой приём часто используется чтобы вывести записи вида login:password Запрос можно отправить и так SELECT concat(id,':',bitcoin_key) FROM secret; Однако лучше всего взять в привычку делать как в предыдущем варианте - энкодить спецсимволы 0x3a = :

Удалим теперь одну из записей с помощью оператора delete, выполнив запрос delete from secret WHERE bitcoin_key = "main_top_secret_password";
Здесь мы указали явным образом что хотим удалить запись main_top_secret_password, которая находится в колонке bitcoin_key и таблице secret. Теперь выведем все значения из таблицы secret и видим что запись действительно удалена.

5.png


Если же не указывать условие для удаления WHERE, и отправить запрос так delete from secret; то удалится всё содержимое. Итак, удалим всё содержимое и попробуем вывести все записи. Как видим их больше нет. Теперь удалим таблицу полностью, используя оператор DROP
DROP TABLE secret; и снова попробуем вывести данные из таблицы secret. Теперь на нас ругаются, и сообщают, что такой таблицы нет.

6.png


Если бы нам нужно было удалить не всю таблицу или поле, а колонку, то сделать это можно было бы так alter table table_name DROP column column_name; Полностью удалить базу можно так DROP DATABASE database_name;
Несмотря на то что сейчас у нас осталась совершенно голая база golden_key, мы ещё вполне можем выудить некоторое количество информации. Например директорию базы данных, имя компьютера(хоста), порт базы и другое.

7.png


Также, имея доступ к базе, мы может читать файлы на сервере select LOAD_FILE('/etc/passwd'); или select LOAD_FILE('/var/www/html/index.html') и пр.

8.png


Теперь полностью удалим нашу базу DROP DATABASE golden_key; и проверим что у нас с юзерами.

9.png


Очевидно, что удаление базы не повлияло никак на хранение данных о пользователе. Более того, мы можем спокойно зайти в СУБД под юзером buratino, правда доступ у него будет только к INFORMATION_SCHEMA.

Посмотреть привилегии пользователя SHOW GRANTS for root@localhost;
10.png


ROOT имеет все привилегии. Теперь удалим buratino и проверим заново списки юзеров

11.png


На этой ноте закончим разбирать возможности sql запросов. Рекомендую обязательно всё проделать, что написано в обоих частях. Для начальной подготовки вполне хватит. Думаю в другой раз напишу уже непосредственно "по боевой части" - будем наконец уже взламывать, а пока малость потренируйтесь "на кошках".
 
Последнее редактирование:

Co.lure.c

One Level
30.10.2016
4
1
BIT
0
А что означают 2 собачки перед дерикторией, хостом и портом?
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
А что означают 2 собачки перед директорией, хостом и портом?
Ровным счётом ничего, такой синтаксис, то есть зарезервированное выражение, типа как в линукс id, pwd, ls... То есть здесь @@ это не что-то отдельное, пишется слитно @@hostname, @@datadir, @@PORT и др.
Также встречаются дублирующие варианты, например @@version =version()

123.png
 

Co.lure.c

One Level
30.10.2016
4
1
BIT
0
Спс, отличная статья. Все довольно просто и понятно изложено.
 

Игорь87

One Level
11.12.2021
3
1
BIT
0
1639506546681.png

Ахах... А я этот пропуск заметил только после того как нагулил синтаксис запроса delete from.

Спасибо за статьи! Давно хотел подойти к БД, но боялся
 
  • Нравится
Реакции: explorer
Мы в соцсетях:

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