Что такое SQL инъекция: изучаем на примерах

SQL инъекция - это атака, которая задействует динамические операторы SQL, вынося в комментарии определенные части инструкций или добавляя условие, которое всегда будет истинным. Она нацелена на дыры в архитектуре веб-приложений и использует операторы SQL для выполнения вредоносного SQL-кода:

В этой статье мы рассмотрим методы, используемые при SQL-инъекциях и способы защиты веб-приложений от таких атак.

Как работает SQL-инъекция

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

Рассмотрим простое веб-приложение с формой входа. Код HTML-формы приведен ниже:

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

Здесь:

  • Форма принимает адрес электронной почты, а затем пароль отправляется в файл PHP с именем index.php;
  • Сессия хранится в файле cookie. Эта возможность активируется при установке флажка remember_me. Для отправки данных используется метод post. Это означает, что значения не отображаются в URL-адресе.

Предположим, что запрос для проверки идентификатора пользователя на стороне сервера выглядит следующим образом:

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

Здесь:

  • Запрос использует значения массива $ _POST[] напрямую, не санируя его;
  • Пароль шифруется с использованием алгоритма MD5.

Мы рассмотрим атаку с использованием SQL инъекции sqlfiddle. Откройте в браузере URL-адрес http://sqlfiddle.com/. На экране появится следующее окно.

Примечание: вам нужно будет написать инструкции SQL:

Как работает SQL-инъекция

Шаг 1. Введите этот код в левую панель:

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));

insert into users (email,password) values ('m@m.com',md5('abc'));

Шаг 2. Нажмите кнопку «Build Schema».
Шаг 3. Введите приведенный ниже код в правой панели:

select * from users;

Шаг 4. Нажмите «Run SQL». Вы увидите следующий результат:

Как работает SQL-инъекция - 2

Предположим, что пользователь предоставляет адрес электронной почты admin@admin.sys и 1234 в качестве пароля. Запрос, который должен быть выполнен в базе данных, может выглядеть следующим образом:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

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

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

и xxx в поле пароля.

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

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

Здесь:

  • xxx@xxx.xxx заканчивается одной кавычкой, которая завершает строку;
  • OR 1 = 1 LIMIT 1 - это условие, которое всегда будет истинным, оно ограничивает возвращаемые результаты только одной записью.

0; ' AND … - это комментарий SQL, который исключает часть пароля.

Скопируйте приведенный выше запрос и вставьте его в текстовое поле SQL FiddleRun SQL, как показано ниже:

Хакерская активность: SQL-инъекции в веб-приложения

У нас есть простое веб-приложение, доступное по адресу http://www.techpanda.org/, которое специально сделано уязвимым для атак с использованием SQL инъекций для новичков в демонстрационных целях. Код HTML-формы, приведенный выше, взят со страницы авторизации данного приложения.

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

Чтобы обойти его, можно использовать поле пароля. На приведенной ниже диаграмме показаны шаги, которые нужно выполнить:

Хакерская активность: SQL-инъекции в веб-приложения

Предположим, что злоумышленник предоставляет следующие данные:

Шаг 1: Вводит xxx@xxx.xxx в качестве адреса электронной почты;
Шаг 2: Вводит xxx') OR 1 = 1 -- ];

Хакерская активность: SQL-инъекции в веб-приложения - 2

Нажимает кнопку «Отправить».

Он будет направлен в панель администрирования. Сгенерированный запрос будет выглядеть следующим образом:

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

На приведенной ниже диаграмме показано, как запрос был сгенерирован:

Здесь:

  • В запросе предполагается, что используется шифрование md5;
  • Используется закрывающаяся одиночная кавычка и скобка;
  • К оператору добавляется условие, которое всегда будет истинным.

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

Другие типы атак с использованием SQL-инъекций

SQL-инъекции могут нанести гораздо больший ущерб, чем вход в систему в обход механизма авторизации. Некоторые из таких атак могут:

  • Выполнить удаление данных;
  • Выполнить обновление данных;
  • Выполнить добавление данных;
  • Выполнить на сервере команды, которые будут загружать и устанавливать вредоносные программы;
  • Выполнить экспорт на удаленный сервер злоумышленника ценных данных, таких как реквизиты кредитной карты, электронная почта и пароли.

Приведенный выше список не является полным. Он просто дает представление о том, какую опасность представляют SQL-инъекции.

Инструменты для автоматизации SQL-инъекций

В приведенном выше примере мы использовали методы ручной атаки. Перед тем, как сделать SQL инъекцию, нужно понимать, что существуют автоматизированные инструменты, которые позволяют выполнять атаки эффективнее и быстрее:

  • SQLSmack;
  • SQLPing 2;
  • SQLMap.

Защита от SQL инъекций

Вот несколько простых правил, которые позволят защититься от атак с использованием SQL-инъекций:

Ввод пользовательских данных не должен быть доверенным. Его всегда нужно санировать, прежде чем данные будут использоваться в динамических операциях SQL.

Хранимые процедуры - они могут инкапсулировать SQL-запросы и обрабатывать все входные данные в качестве параметров.

Подготовленные запросы - сначала создаются запросы, а затем все предоставленные пользовательские данные обрабатываются в качестве параметров. Это не влияет на синтаксис инструкции SQL.

Регулярные выражения - могут быть использованы для обнаружения потенциально вредоносного кода и его удаления перед выполнением операторов SQL.

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

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

Хакерская активность: использование для SQL-инъекций Havij

В этом практическом сценарии мы собираемся использовать программу Havij Advanced SQL Injection для сканирования уязвимостей сайта.

Примечание. Ваша антивирусная программа может реагировать на эту программу в силу ее природы. Поэтому необходимо добавить ее в список исключений или приостановить работу антивирусного программного обеспечения:

Хакерская активность: использование для SQL-инъекций Havij

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

Заключение

  • SQL инъекции - это тип атак, который задействует ненадежные запросы SQL;
  • SQL-инъекции могут использоваться для обхода алгоритмов авторизации, извлечения, вставки, обновления и удаления данных;
  • Перечень инструментов для SQL-инъекций включает в себя SQLMap, SQLPing и SQLSmack и другие;
  • Продуманная политика безопасности при написании запросов поможет защититься от атаки с использованием SQL-инъекций.

Вадим Дворниковавтор-переводчик статьи «SQL Injection Tutorial: Learn with Example»