Всем привет!
В ПЕРВОЙ ЧАСТИ были рассмотрены некоторые приёмы и операторы. Углубимся в тему.
Стартуем сервис mysql, заходим под пользователем buratino и попробуем ввести такую команду SELECT User, Host, Password, password_expired FROM mysql.user;
Мы получили ошибку, в которой говорится что он не имеет доступа к таблице user. Почему так произошло, ведь мы ему наделили полные права. Дело в том, что права у него только на базу golden_key, а здесь запрос к базе mysql. Когда мы выводили список баз, то их было две - golden_key и information_schema. Откуда тогда взялась база mysql? Дело в том что MariaDB имеет несколько баз, и сейчас мы зайдём под root и сможем вывести полный список.
Ага, появились ещё 2 базы, которых мы ранее не видели mysql и performance_schema. База performance_schema нужна для мониторинга, диагностики, анализа, и нас она не интересует. Повторим наш запрос
Теперь всё сработало. В этой команде мы сделали выбор пользователей базы mysql, имя хоста, пароли юзеров(хранятся в хэше) и проверили срок действия паролей. В данном случае нет ограничений.
Теперь обратите внимание как сделан запрос mysql.user Мы обращаемся к базе mysql и таблице user Делается это через точку, так же мы поступали в прошлой статье - INFORMATION_SCHEMA.TABLES Регистр написания не имеет значения, поэтому пишите как хотите.
Со временем какие-то данные теряют актуальность, и базу нужно подредактировать. Чтобы сервер MySQL знал в какой базе мы редактируем, выполним уже знакомую команду USE golden_key;
Но прежде чем отредактировать, хочу показать очень полезный приём - конкатенация. Это операция склеивания. То есть мы можем вывести какие-то данные в одну строку. Отправим запрос SELECT concat(id,0x3a,bitcoin_key) FROM secret;
Здесь мы объединили значения из колонок id и bitcoin_key, используя в качестве разделителя двоеточие. Такой приём часто используется чтобы вывести записи вида loginassword Запрос можно отправить и так 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 и видим что запись действительно удалена.
Если же не указывать условие для удаления WHERE, и отправить запрос так delete from secret; то удалится всё содержимое. Итак, удалим всё содержимое и попробуем вывести все записи. Как видим их больше нет. Теперь удалим таблицу полностью, используя оператор DROP
DROP TABLE secret; и снова попробуем вывести данные из таблицы secret. Теперь на нас ругаются, и сообщают, что такой таблицы нет.
Если бы нам нужно было удалить не всю таблицу или поле, а колонку, то сделать это можно было бы так alter table table_name DROP column column_name; Полностью удалить базу можно так DROP DATABASE database_name;
Несмотря на то что сейчас у нас осталась совершенно голая база golden_key, мы ещё вполне можем выудить некоторое количество информации. Например директорию базы данных, имя компьютера(хоста), порт базы и другое.
Также, имея доступ к базе, мы может читать файлы на сервере select LOAD_FILE('/etc/passwd'); или select LOAD_FILE('/var/www/html/index.html') и пр.
Теперь полностью удалим нашу базу DROP DATABASE golden_key; и проверим что у нас с юзерами.
Очевидно, что удаление базы не повлияло никак на хранение данных о пользователе. Более того, мы можем спокойно зайти в СУБД под юзером buratino, правда доступ у него будет только к INFORMATION_SCHEMA.
Посмотреть привилегии пользователя SHOW GRANTS for root@localhost;
ROOT имеет все привилегии. Теперь удалим buratino и проверим заново списки юзеров
На этой ноте закончим разбирать возможности sql запросов. Рекомендую обязательно всё проделать, что написано в обоих частях. Для начальной подготовки вполне хватит. Думаю в другой раз напишу уже непосредственно "по боевой части" - будем наконец уже взламывать, а пока малость потренируйтесь "на кошках".
В ПЕРВОЙ ЧАСТИ были рассмотрены некоторые приёмы и операторы. Углубимся в тему.
Стартуем сервис mysql, заходим под пользователем buratino и попробуем ввести такую команду SELECT User, Host, Password, password_expired FROM mysql.user;
Мы получили ошибку, в которой говорится что он не имеет доступа к таблице user. Почему так произошло, ведь мы ему наделили полные права. Дело в том, что права у него только на базу golden_key, а здесь запрос к базе mysql. Когда мы выводили список баз, то их было две - golden_key и information_schema. Откуда тогда взялась база mysql? Дело в том что MariaDB имеет несколько баз, и сейчас мы зайдём под root и сможем вывести полный список.
Ага, появились ещё 2 базы, которых мы ранее не видели mysql и performance_schema. База performance_schema нужна для мониторинга, диагностики, анализа, и нас она не интересует. Повторим наш запрос
Теперь всё сработало. В этой команде мы сделали выбор пользователей базы mysql, имя хоста, пароли юзеров(хранятся в хэше) и проверили срок действия паролей. В данном случае нет ограничений.
Теперь обратите внимание как сделан запрос mysql.user Мы обращаемся к базе mysql и таблице user Делается это через точку, так же мы поступали в прошлой статье - INFORMATION_SCHEMA.TABLES Регистр написания не имеет значения, поэтому пишите как хотите.
Со временем какие-то данные теряют актуальность, и базу нужно подредактировать. Чтобы сервер MySQL знал в какой базе мы редактируем, выполним уже знакомую команду USE golden_key;
Но прежде чем отредактировать, хочу показать очень полезный приём - конкатенация. Это операция склеивания. То есть мы можем вывести какие-то данные в одну строку. Отправим запрос SELECT concat(id,0x3a,bitcoin_key) FROM secret;
Здесь мы объединили значения из колонок id и bitcoin_key, используя в качестве разделителя двоеточие. Такой приём часто используется чтобы вывести записи вида loginassword Запрос можно отправить и так 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 и видим что запись действительно удалена.
Если же не указывать условие для удаления WHERE, и отправить запрос так delete from secret; то удалится всё содержимое. Итак, удалим всё содержимое и попробуем вывести все записи. Как видим их больше нет. Теперь удалим таблицу полностью, используя оператор DROP
DROP TABLE secret; и снова попробуем вывести данные из таблицы secret. Теперь на нас ругаются, и сообщают, что такой таблицы нет.
Если бы нам нужно было удалить не всю таблицу или поле, а колонку, то сделать это можно было бы так alter table table_name DROP column column_name; Полностью удалить базу можно так DROP DATABASE database_name;
Несмотря на то что сейчас у нас осталась совершенно голая база golden_key, мы ещё вполне можем выудить некоторое количество информации. Например директорию базы данных, имя компьютера(хоста), порт базы и другое.
Также, имея доступ к базе, мы может читать файлы на сервере select LOAD_FILE('/etc/passwd'); или select LOAD_FILE('/var/www/html/index.html') и пр.
Теперь полностью удалим нашу базу DROP DATABASE golden_key; и проверим что у нас с юзерами.
Очевидно, что удаление базы не повлияло никак на хранение данных о пользователе. Более того, мы можем спокойно зайти в СУБД под юзером buratino, правда доступ у него будет только к INFORMATION_SCHEMA.
Посмотреть привилегии пользователя SHOW GRANTS for root@localhost;
ROOT имеет все привилегии. Теперь удалим buratino и проверим заново списки юзеров
На этой ноте закончим разбирать возможности sql запросов. Рекомендую обязательно всё проделать, что написано в обоих частях. Для начальной подготовки вполне хватит. Думаю в другой раз напишу уже непосредственно "по боевой части" - будем наконец уже взламывать, а пока малость потренируйтесь "на кошках".
Последнее редактирование: