Что нужно знать об SQL-инъекциях
SQL-инъекции — термин для обозначения одного из наиболее распространённых типов атаки на сайты. Сообщество по обеспечению безопасности OWASP включило его в десятку самых известных методов атак, в числе которых также межсайтовый скриптинг, использование компонентов с известными уязвимостями, непроверенные переадресации.
SQL-инъекции часто применяют для получения доступа к веб-ресурсам хакеры и пентестеры. Этот метод появился более 20 лет назад, но SQL-инъекции по-прежнему применяются, и довольно успешно. Угрозе подвергаются те веб-сайты, что не защищены безопасным кодированием.
В этой статье мы расскажем, как именно действуют SQL-инъекции и в чём их вред. Если вы совсем не знакомы с этой тематикой, и что-то будет для вас непонятно, ниже мы подробно рассмотрим азы. Там будет информация о реляционных базах данных и о том, как формируются SQL-запросы.
Принцип действия SQL-инъекций
Задача хакера — попытаться изменить SQL-выражение, которое веб-сервис направляет в БД. Для этого в форму аутентификации для пользователя поставляются специальные данные. Ниже приведем несколько примеров для наглядности.
Пример атаки с SQL-инъекцией
Вводимые пользователем в форму имя и пароль всегда сверяются с данными из БД. Если там всё верно и нет никаких ошибок, то веб-страница разрешит ему доступ.
В БД отправляется такой SQL-запрос:
SELECT * FROM users WHERE username=’ProvidedUsername’ and password=’ProvidedPassword’;
В этом случае произойдёт извлечение из таблицы users всех тех записей, где указано имя пользователя ProvidedUsername, а пароль — ProvidedPassword. Если в таблице найдётся запись, соблюдающая оба этих условия, то пользователь правильно ввёл имя и пароль. А значит, ему откроется доступ.
Теперь предположим, что вместо имени пользователь введёт вот это:
a’ OR 1=1;--
А вместо пароля — случайный набор символов (неважно, что будет вписано в это поле, ниже мы об этом скажем).
Приложение сформирует следующее SQL-выражение:
SELECT * FROM users WHERE username=’a’ OR 1=1;--’ and password=’RandomPass’;
При обработке этого запроса БД извлечёт запись из таблицы с именем users, если в ней имя пользователя указано как a. Она будет извлечена и в случае выполнения второго условия — если выражение 1=1 верно. То есть тут используется принцип «верно это значение ИЛИ то значение». А так как 1=1 верно всегда, при вводе такого запроса будут извлечены все записи из таблицы.
Обратите также внимание на дублирующийся дефис в SQL-выражении. Его используют для комментариев — получается, что остальная часть строки будет закомментирована. То есть БД её обрабатывать не будет.
Получается, что БД выполнит только эту часть запроса:
SELECT * FROM users WHERE username=’a’ OR 1=1;--’ and password=’RandomPass’;
При обработке запроса БД извлечёт список записей, которые отличаются от NULL. Следовательно, пользователь получит доступ.
Подробнее о реляционных базах данных
Рассмотрим реляционные базы данных (БД). В них хранится информация, представленная в виде двухмерных таблиц. В каждой содержатся столбцы и строки. В строках (записях) будут размещаться описания каждого отдельного свойства объекта, а столбцы (атрибуты) нужны для извлечения определённых свойств из строки.
Пример. Рассмотрим таблицу с названием users.
Здесь мы видим три столбца — Id, User, Password. В этой таблице есть две строки.
Сведения из таблицы напоминают нам учётные данные пользователей. Когда они внесут своё имя и пароль в форму на сайте, система сверит их с информацией, которая хранится в такой таблице. И если они там будут обнаружены, то пользователю откроется доступ к приватной странице.
Мы привели самый простой пример реляционной БД. Но в основном они многосложные — с комплексом таблиц, а в них порой миллионы столбцов и строк. При этом таблицы часто взаимосвязаны с помощью внешних ключей. Эти ключи нужны для того, чтобы ссылаться на определённые данные из других таблиц.
Синтаксис языка SQL-запросов
Язык SQL нужен для управления реляционными БД. Его используют для просмотра, добавления, обновления и удаления данных.
Базовые SQL-выражения
Веб-сайты используют SQL-запросы для получения сведений из БД. В начале каждого из них всегда прописывается какая-то команда.
Пример. Перед нами SQL-выражение:
SELECT * FROM users;
В начале стоит команда SELECT — она нужна для получения данных из БД. Но эта команда сама по себе не даёт точной инструкции, а только определяет требования к возвращаемому набору данных. Поэтому она нуждается в дополнительных уточнениях. Для этого после неё здесь следует символ звёздочки, обозначающей обращение к данным сразу из всех столбцов таблицы.
Далее идёт ключевое слово FROM и название таблицы — users. Это значит, что данные будут извлекаться ИЗ таблицы именно с этим именем.
Читается это SQL-выражение так:
Извлечь данные всех столбцов из таблицы users.
А сейчас попробуем разнообразить этот SQL-запрос:
SELECT * FROM users WHERE user=’Mary’;
Мы даём здесь следующую команду: получить только те записи, где в качестве имени пользователя указано слово Mary.
Команды и ключевые слова SQL
Сейчас мы перечислим самые популярные команды и ключевые слова SQL. Вам не обязательно очень хорошо знать их, чтобы разобраться в теме SQL-инъекций. Однако всё же стоит изучить и эту информацию более детально.
- SELECT получает данные. Эта команда определяет список возвращаемых столбцов, их имена. Также она устанавливает ограничения — на уникальность строк или на количество строк в данных.
- INSERT INTO добавляет записи. Они будут загружаться в указанную таблицу БД.
- UPDATE обновляет записи. Команда вносит изменения в уже существующие строки таблицы.
- DELETE удаляет записи. Требуется для того, чтобы убрать из таблиц в БД ненужные строки.
- CREATE TABLE создаёт таблицу. В БД будет добавлена новая таблица.
- FROM задаёт выражение. Оно будет определять базовый набор данных для применения операций, указанных в других предложениях запроса.
- WHERE задаёт ограничение. Команда фильтрует записи по конкретному условию.
- ORDER BY сортирует данные. Речь идёт о сведениях, полученных командой SELECT. После этого отсортированные записи попадают в точку вызова.
Что нужно запомнить
SQL-инъекция — это метод атаки на сайты.
Язык SQL нужен для управления реляционными БД.
В языке SQL есть запросы, состоящие из команд и ключевых слов.
Принцип действия SQL-инъекции — изменение SQL-выражения, которое веб-приложение направляет в БД.