SQL-Injection

Внедрение SQL-кода (SQL инъекция) — один из распространённых способов взлома сайтов, работающих с базами данных. Уязвимости SQL-инъекций позволяют злоумышленникам выполнять произвольный код SQL в базе данных, позволяя получать, изменять или удалять данные независимо от разрешений пользователя. Успешная инъекционная атака может подделать удостоверения, создать новые удостоверения с правами администратора, получить доступ ко всем данным на сервере или уничтожить / изменить данные, чтобы сделать их непригодными для использования.

Задача хакера — попытаться изменить SQL-выражение, которое веб-сервис направляет в БД. Для этого в форму аутентификации для пользователя поставляются специальные данные. Ниже приведем несколько примеров для наглядности.

Пример атаки с SQL-инъекцией

Untitled

Вводимые пользователем в форму имя и пароль всегда сверяются с данными из БД. Если там всё верно и нет никаких ошибок, то веб-страница разрешит ему доступ.

В БД отправляется такой SQL-запрос:

SELECT * FROM users WHERE username=’login’ and password=’pass’;

В этом случае произойдёт извлечение из таблицы 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-выражении. Его используют для комментариев — получается, что остальная часть строки будет закомментирована. То есть БД её обрабатывать не будет.

Комментарии могут быть двух типов: однострочные и многострочные. В зависимости от типа применяется различный синтаксис. Однострочные начинаются с сочетания двух тире (--) и продолжаются до конца строки. Многострочные комментарии начинаются с сочетания символов слеша и звездочки (/*) и заканчиваются ими же, но в другой последовательности (*/).

-- Пример однострочного комментария

/* Комментарий
на
несколько
строк  */

/* Многострочный комментарий в одну строку */

Синтаксис комментариев зависит от системы, к которой выполняется запрос. Приведенные выше примеры подходят для систем MS SQL Server и Oracle, являющимися самыми распространенными.

Получается, что БД выполнит только эту часть запроса:

SELECT * FROM users WHERE username=’a’ OR 1=1;--’ and password=’RandomPass’;