SQL-инъекция (или SQLi) обычно упоминается как наиболее распространенный тип атаки на веб-сайты, который заключается во внедрении в запрос произвольного SQL кода. Это понятие широко используется хакерами и тестировщиками проникновений веб-ресурсов.
В списке “OWASP Top Ten” (топ 10 самых актуальных уязвимостей приложений) SQL Injection находится в числе других инъекций и занимает первое место среди них, поэтому важно знать как защитить свой ресурс от данной уязвимости.
Хотя о пагубном влиянии SQL-инъекции известно больше двух десятков лет, не все сайты и приложения имеют защиту от них.
Эта статья будет полезна новичкам, которые пока что не знакомы с понятием SQL-инъекций. Сначала мы рассмотрим базис, который важно уяснить, чтобы понять принцип действия SQL-инъекций и как с ними бороться: для начала мы узнаем такое определение, как реляционные базы данных, что такое SQL, как формируется SQL-запрос, рассмотрим, как действуют SQL-инъекции и что делает их такими опасными для интернет-ресурсов.
Реляционные базы данных
Без понимания работы реляционных баз, сложно понять как работают инъекции. Реляционная база данных - это тип базы данных, в которой хранятся части данных, которые могут быть идентифицированы по отношению друг к другу, проще говоря, это данные, которые имеют связи между собой. Проще всего такую систему вывести в таблицах, поэтому данные в реляционной базе хранятся в таблицах.
В качестве примера ниже представлена таблица с именем "users":
Эта простая таблица состоит из трех столбцов, в которые занесены некоторые данные пользователей. Если пользователь, он же "user" предоставляет свои учетные данные в форме аутентификации, то веб-приложение проверяет, присутствуют ли они в таблице выше. Таким образом приложение узнает, следует предоставить или отказать пользователю в доступе к веб-странице с ограниченным доступом только для пользователей.
Предложенный пример довольно простой, реляционные базы данных имеет намного более сложную структуру, в них гораздо больше таблиц, каждая из которых несет большое количество информации и различных значений (иногда миллионы). Таблицы очень часто имеют связи друг с другом.
Для наших целей это вся информация, которую нужно понимать и знать о реляционных базах данных.
SQL
Язык структурированных запросов (или SQL) - это язык, позволяющий управлять реляционными базами данных. Он используется веб-приложениями для просмотра, добавления, обновления или удаления данных из базы данных.
Базовая инструкция SQL
Веб-приложения работают с базами данных при помощи операторов SQL. Каждый оператор SQL начинается с команды.
Ниже предложен наиболее простой пример написания команды данного языка:
SELECT * FROM users;
В этом примере оператор SQL начинается с команды 'SELECT', она дает возможность извлечь данные из таблицы.
После команды 'SELECT' следует знак звездочки (*). В этом примере этот знак подразумевает все имеющиеся столбцы. Это означает, что действие подразумевает извлечение данных из всех столбцов. Команда 'FROM' показывает, что данные будут извлекаться из таблицы под названием 'users'.
Вкратце, вышеприведенный оператор SQL можно перевести следующим образом:
"Извлечь данные всех столбцов из таблицы 'users'".
Итак, сейчас можно сделать предложенное SQL-выражение поинтересней, добавив условие:
SELECT * FROM users WHERE user='Fyodor';
Здесь указывается, что будут извлекать только те записи, которые имеют имя 'Fyodor' в поле user, вместо того, чтобы извлекать все записи. Это станет более интересным, когда будут рассмотрены SQL-инъекции в следующем разделе.
Команды и ключевые слова языка
В завершении рассмотрения языка структурированных запросов можно обратить внимание на список некоторых наиболее часто используемых команд и ключевых слов. Не нужно знать их все, чтобы понять основную часть темы данного объяснения SQL-инъекции, но знакомство с ними будет крайне полезным:
- SELECT: извлекает данные из таблицы.
- INSERT INTO: добавляет запись в таблицу.
- UPDATE: обновляет запись из таблицы.
- DELETE: удаляет запись из таблицы.
- CREATE TABLE: создает новую таблицу.
- WHERE: фильтрует записи в зависимости от того, удовлетворяют ли они условию или нет.
- ORDER BY: сортирует данные, полученные с помощью SELECT.
SQL Injection
SQL-инъекция (или SQLi) - это тип атаки на веб-приложение. Она пытается изменить SQL-запрос, который приложение отправляет в базу данных, путем предоставления злонамеренно созданных данных в поле ввода пользователя.
Чтобы сделать это определение более понятным, можно рассмотреть следующий случай.
Внедрение SQL-инъекций
Допустим, есть форма аутентификации, которая просит пользователя ввести имя пользователя и пароль. Приложение предоставляет пользователю доступ в зависимости от того, правильно ли введены данные. Точнее говоря, приложение отправляет SQL-запрос в базу данных, чтобы проверить, присутствуют ли там эти учетные данные. Этот запрос будет выглядеть примерно так:
SELECT * FROM users WHERE username=' ProvidedUsername' and
password='ProvidedPassword';
Если Вы были внимательны во время прочтения информации этой статьи, то этот оператор SQL должен быть понятен. Он извлекает все записи из базы данных "users", где поле имени пользователя равно 'ProvidedUsername', а поле пароля равно 'ProvidedPassword'. Если есть запись, удовлетворяющая этим двум условиям, значит, имя пользователя и пароль верны, и приложение предоставляет пользователю доступ.
Далее можно предположить, что пользователь вводит не имя, а, например, вот такое значение:
a' OR 1=1;-
После этого, в качестве пароля, пользователь набирает случайное значение (это значение пароля здесь не имеет смысла, потом будет понятно, почему).
Затем веб-приложение сформирует следующий SQL-запрос:
SELECT * FROM users WHERE username='a' OR 1=1;--' и password='RandomPass';
Этот запрос получит любую запись из таблицы users, которая либо имеет имя пользователя 'a', либо 1=1 является истиной.
Поскольку 1=1 всегда истинно, то это утверждение также всегда будет истинным, и, следовательно, этот запрос получит все записи из таблицы.
Кроме того, поскольку двойное тире '--' используется для комментариев в SQL, остальная часть строки закомментирована и не будет обрабатываться базой данных.
Вот как выглядит этот запрос сейчас:
SELECT * FROM users WHERE username='a' OR 1=1;--' and password='RandomPass';
После выполнения этой команды доступ к данным пользователю будет предоставлен.
Вычисление уязвимостей
Всегда можно проверить свой сайт или приложение на возможность применения на нем SQL инъекций. С этой задачей легко и быстро справляются специально созданные сервисы, также это можно сделать самостоятельно, если изменить значения в определенных операторах запросов.
Вывод
Мы рассмотрели здесь только один вариант SQL-инъекции, но известно большое количество других способов инъекции SQL-кода в веб-приложение.
Провайдер VPSville.ru не только предоставляет виртуальные сервера для различных задач в интернете, но предлагает дополнительные услуги для развертывания и упрощения работы с IT-инфраструктурой. Надежный провайдер не позволит пройти SQL инъекции и вся информация базы данных будет в безопасности.
Основная информация в статье написана на основании статьи https://patchthenet.medium.com/introduction-to-sql-injection-sql-injection-for-beginners-579c00431d40.