16 июня 2021 г.
Время чтения: 4 минуты

Что нужно знать об 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-инъекций. Однако всё же стоит изучить и эту информацию более детально.

  1. SELECT получает данные. Эта команда определяет список возвращаемых столбцов, их имена. Также она устанавливает ограничения — на уникальность строк или на количество строк в данных.
  2. INSERT INTO добавляет записи. Они будут загружаться в указанную таблицу БД.
  3. UPDATE обновляет записи. Команда вносит изменения в уже существующие строки таблицы.
  4. DELETE удаляет записи. Требуется для того, чтобы убрать из таблиц в БД ненужные строки.
  5. CREATE TABLE создаёт таблицу. В БД будет добавлена новая таблица.
  6. FROM задаёт выражение. Оно будет определять базовый набор данных для применения операций, указанных в других предложениях запроса.
  7. WHERE задаёт ограничение. Команда фильтрует записи по конкретному условию.
  8. ORDER BY сортирует данные. Речь идёт о сведениях, полученных командой SELECT. После этого отсортированные записи попадают в точку вызова.

Что нужно запомнить

SQL-инъекция — это метод атаки на сайты.

Язык SQL нужен для управления реляционными БД.

В языке SQL есть запросы, состоящие из команд и ключевых слов.

Принцип действия SQL-инъекции — изменение SQL-выражения, которое веб-приложение направляет в БД.

За четырехдневкой айтишников последует зомбоапокалипсис!

Найдены главные проблемы в SEO. Часть 1

Рекомендуем

Домен .SALE: как купить его за 790 ₽ и для каких сайтов использовать

Защита PHP-сайта: зачем подключать услугу «Антивирус для PHP-сайтов» на хостинге

© Джино, 2003–2024. «Джино» является зарегистрированным товарным знаком.
Лицензия на телематические услуги связи № 150549 от 09.03.2017.
Правовая информация Политика конфиденциальности Карта сайта