5.1. Основы SQL

 

Существуют различные системы управления базами данных (СУБД). Некоторые из них бесплатные, а некоторые – коммерческие. Ниже представлен список самых популярных БД:

  • MySQL
  • Oracle Database
  • Microsoft SQL
  • PostgreSQL
  • SQLite

Все они используют язык SQL, чей синтаксис может немного отличаться для той или иной СУБД.

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

Для отработки навыков я подготовил файл, который содержит некоторые данные. Вам остается их импортировать в систему.

 

Создание БД в MySQL и импорт данных

В Kali откройте терминал и запустите службу MySQL командой sudo service mysql start.

Затем подключитесь к самой СУБД: sudo mysql -u root. Мы подключаемся к ней в качестве пользователя root. По умолчанию пароль не установлен.

Запустите команду show databases;. Обратите внимание, что после команды следует точка с запятой:

Список баз данных в MySQL

Команда отображает список существующих баз данных. По умолчанию MySQL уже имеет некоторые базы данные и их таблицы.

Мы создадим нашу собственную БД: CREATE DATABASE sql_tutorial;

Название можете выбрать произвольное. Если снова отобразить список доступных БД, то увидите только что созданную БД:

Отображение всех баз данных в MySQL

Теперь выйдем из режима MySQL командой exit; и импортируем данные в нашу БД:

sudo mysql –u root sql_tutorial < /root/Desktop/basics.sql

Снова подключаемся к СУБД и выбираем созданную БД командой use sql_tutorial;. В строке терминала будет отображаться название БД вместо none:

Выбрана БД

Выполните show tables;, чтобы отобразить все таблицы в данной БД:

Отображение списка таблиц в БД MySQL

С этого момента мы можем полностью использовать базу данных и ее таблицы.

 

Подключение к PostgreSQL

PostgreSQL уже установлена на Kali, поэтому вы также можете тренироваться на ней и тестировать различные комбинации.

Для начала запустите службу PostgreSQL:

sudo service postgresql start

Затем подключитесь к базе данных в качестве пользователя postgres:

sudo -u postgres psql

Для отображения доступных баз данных выполните команду \l:

Отображение списка БД в PostgreSQL

Для подключения к нужной БД используйте команду \c название_БД:

подтверждение выбора БД

Чтобы отобразить список таблиц в текущей БД выполните \d:

Отображение списка таблиц в PostgreSQL

Синтаксис SQL запросов для создания новых БД и их таблиц аналогичен MySQL. Все последующие SQL выражения, представленные в статье, можно использовать на обеих СУБД.

 

Извлечение данных

Задача. Извлечь список пользователей (name, surname) из таблицы users.

Решение. Для извлечения данных нам нужно составить запрос вида SELECT имя_столбца FROM имя_таблицы.

В переводе с английского означает “ИЗВЛЕЧЬ данные в столбце (название столбца) ИЗ таблицы (название таблицы)”. Выполните команду:

SELECT name, surname FROM users;

Результат работы SQL запроса

Как видите из запроса выше, чтобы извлечь больше данных вы можете указать соответствующие названия столбцов, разделенных запятой.

 

Извлечение данных по условиям

Задача. Извлечь список пользователей, чей возраст составляет более 40 лет.

Решение. Конструкцию SELECT имя_столбца FROM имя_таблицы мы дополним новым оператором WHERE имя_столбца = значение. Причем мы можем использовать такие знаки, как =, <, >.

Теперь выполним запрос SELECT name, surname, age FROM users WHERE age>40;

Вывод данных по условиям

Если вам нужно указать несколько условий, то все они объединяются операторами AND (Логическое И) или OR (Логическое ИЛИ).

Например, составим следующие условия: возраст более 40 лет И зарплата от 50 000 и выше. Тогда наш запрос будет выглядеть так:

SELECT name, surname FROM users WHERE age>40 AND salary>50000;. То есть AND означает, что должны соблюдаться все условия.

Другой пример. Извлечем пользователей, которые младше 30 и старше 40. Наш запрос будет такой:

SELECT name, surname FROM users WHERE age<30 OR age>40;.

Здесь OR означает, что достаточно, если будет соблюдено хотя бы одно условие (ИЛИ первое условие ИЛИ второе условие).

 

Извлечение данных по ключевому слову

Задача. Получить список пользователей, у которых адрес электронной почты заканчивается на mail.com.

Решение. Для данной операции мы воспользуемся новым оператором LIKE (в переводе “как”) и специальной маской % (знак процента). Данная маска означает любой(ые) символ(ы) произвольной длины. Запрос будет выглядеть так:

SELECT name, surname, email FROM users WHERE email LIKE ‘%@mail.com’;

Поиск по ключевому слову

Теперь усложним задачу. В этот раз нам нужно найти пользователей, у которых адрес электронной почты все еще содержит ключевое слово @mail, но принадлежит разным доменам, например, mail. com, mail.ru, mail.net и так далее.

Запрос будет выглядеть так:

SELECT name, surname FROM users WHERE email LIKE ‘%@mail.%’;

Надеюсь, вы поняли, как работает данная маска.

 

Сортировка данных

Задача. Вывести всех пользователей по возрастанию их зарплаты.

Решение. Для начала попробуйте в терминале выполнить запрос:

SELECT name, surname, salary FROM users;.

Все данные по умолчанию будут выведены исходя из того в каком порядке они были записаны в БД.

Чтобы отобразить упорядоченную запись выполним следующий запрос:

SELECT name, surname, salary FROM users ORDER BY salary ASC;.

После оператора ORDER BY мы указываем по какому столбцу сортировать данные. Оператор ASC (Ascend) означает, что нужно сортировать по возрастанию. Однако можно его опустить, так как он всегда используется по умолчанию.

Для сортировки по убыванию вы можете воспользоваться оператором DESC (Descend).

Кстати, после ORDER BY не обязательно указывать название столбца, достаточно указать его порядковый номер в запросе. Поясню на примере.

Чтобы отобразить зарплату, возраст и стаж работы мы воспользуемся запросом:

SELECT name, salary, age, experience FROM users;

У нас отображаются 4 колонки. Именно их мы можем использовать для сортировки данных, причем каждая колонка в запросе имеет свой порядковый номер:  name - 1, salary - 2, age - 3, experience - 4. Теперь после ORDER BY мы можем указать вместо имени столбца его порядковый номер:

SELECT name, salary, age, experience FROM users ORDER BY salary == SELECT name, salary, age, experience FROM users ORDER BY 2;

Или

SELECT name, salary, age, experience FROM users ORDER BY age == SELECT name, salary, age, experience FROM users ORDER BY 3;

Кроме того, можно сортировать вывод сразу по нескольким параметрам. Например, запрос SELECT name, salary FROM users ORDER BY name ASC, salary DESC сортирует сначала имена по алфавиту в группы, а затем в каждой группе сортирует по зарплате. Попробуйте выполнить различные варианты в терминале.

Техника сортировки по номерам столбцов используется в SQL атаках, чтобы определить сколько столбцов выводит SQL запрос на сервере. Это необходимо, чтобы отправить на сервер наш измененный запрос.

 

Вложенные конструкции

Иногда решение той или иной задачи требует составления более сложных конструкций. К ним относят сложные выражения, состоящие из вложенных запросов. Причем результат работы одного запроса полностью влияет на результат работы других запросов.

Составим простой пример, на основе которого вы легко поймете, как работают вложенные выражения и как их составлять.

Задача. Составить список стран, чье население меньше населения Бразилии.

Решение. Наш запрос бы выглядел так:

SELECT country, population FROM countries WHERE population < X,

где X – это население Бразилии. Информация о ней также хранится в БД и является переменной величиной, то есть может меняться исходя из определенных условий. Поэтому сначала определим население Бразилии:

SELECT population FROM countries WHERE country=’Brasil’.

Затем результат данного запроса подставим вместо X:

SELECT country, population FROM countries WHERE population < (SELECT population FROM countries WHERE country='Brasil');

Вложенные конструкции SQL

Это был наиболее простой и наглядный пример. При проведении SQL атак вам также придется составлять сложные выражения, но принцип у всех одинаковый. Просто составьте один простой запрос, а затем для каждой неизвестной переменной составляйте другие более простые запросы. Для объединения нескольких запросов в одно выражение используются специальные символы и функции. Некоторые их них мы рассмотрим далее в этом курсе.

 

Объединение запросов (UNION)

В некоторых случаях необходимо выполнить 2 независимых запроса, а результат выполнения отобразить в одном выводе (потоке). Например, отобразить список имен пользователей, работающих в России и отобразить список стран, которые относятся к Европе.

Оба запроса будут выглядеть так:

SELECT name FROM users WHERE country=’Russia’;

SELECT country FROM countries WHERE continent=’Europe’;

Как видите, оба запроса полностью независимы друг от друга, к тому же запрос проводится к разным таблицам. Однако нам необходимо выполнить одновременно оба запроса и вывести сразу оба результата.

Сделать это легко с помощью оператора UNION, который позволяет объединить оба запроса в одно выражение:

SELECT name FROM users WHERE country=’Russia’

UNION

SELECT country FROM countries WHERE continent=’Europe’;

Пример работы оператора UNION в SQL

Возникает вопрос: «А зачем объединять 2 независимых запроса?».

Оператор UNION очень часто используется в SQL атаках, когда к существующему запросу добавляется вредоносный, причем оба запроса будут выполнены одновременно. И если результат работы первого запроса отображается в браузере, то вывод второго запроса также будет отображен в браузере.

 

Ввод данных

Задача. В таблицу users введите нового пользователя со следующими данными:

Имя (name): Valentin

Фамилия (surname): Levin

Возраст (age): 5

Город проживания (city): Dubai.

Решение. Ввод новых данных осуществляется следующим образом:

INSERT INTO таблица (колонка_1, колонка_2) VALUES (‘значение_1’, ‘значение_2’);

В нашем случае запрос будет выглядеть так:

INSERT INTO users (id, name, surname, age, city) VALUES (‘21’, ‘Valentin’, ‘Levin’, ‘5’, ‘Dubai’);

Зачем нужно уметь добавлять новые записи в БД?

Многие сайты аутентифицируют пользователей с помощью БД. Если вы сможете внедрить в базу данных нового пользователя с администраторскими правами, то вы легко можете получить полный контроль над системой.

 

Удаление данных

Задача. Удалить пользователя, созданного в предыдущем примере.

Решение. Запрос удаления выглядит так:

DELETE FROM таблица WHERE условие;

Чтобы удалить пользователя из предыдущего примера выполните запрос

DELETE FROM users WHERE name=’Valentin’ AND surname=’Levin’;

Можно добавить еще одно условие в виде возраста, чтобы исключить удаление похожего пользователя.

Чем удаление записей БД может быть полезно во взломе сайтов?

Удаление записей или самой таблицы/БД больше носит деструктивный характер.

 

Маски и комментарии

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

Например, чтобы отобразить абсолютно все данные из таблицы достаточно вместо столбцов использовать маску *:

SELECT * FROM countries;

Пример работы маски *

Запрос довольно прост и короток, однако он отобразил все данные из таблицы.

Список некоторых масок для каждой СУБД представлен ниже в таблице:

Символ

СУБД

Описание

Пример

%

Oracle

MySQL

PostgreSQL

Соответствует любому символу или строке произвольной длины

LIKE ‘%mail.ru’

Результат:

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

*

MS SQL

_ (нижнее подчеркивание)

Oracle

MySQL

PostgreSQL

Соответствует произвольному одиночному символу

LIKE ‘_mail’

Результат:

mail

email

gmail

?

MS SQL

- -

Oracle

PostgreSQL

MS SQL

Код и команды после данного символа воспринимаются как комментарии и не исполняются

# sleep(10);

Результат:

Задержка будет игнорироваться

#

MySQL

 

Символы комментирования используются во всех SQL эксплойтах, так как позволяют корректно вставить свой SQL код, не вызывая ошибок выполнения на сервере.