Чек-лист устранения SQL-инъекций
В прошлой статье мы уже рассматривали тему SQL-инъекций.
SQL-инъекции’ union select null,null,null —
Современные веб-приложения имеют сейчас довольно сложную структуру. Вместе с этим, для хранения инфо.
Предлагаем снова остановиться на этой проблеме, так как этот тип атак наиболее распространенный и один из самых опасных. В данной статье мы расскажем о способах выявления SQLi и предложим подробную инструкцию по их ликвидации.
SQL-инъекция — это попытка злоумышленника изменить запрос к базе данных для ее компрометации.
Возможные SQLi:
- Соблюдение условия WHERE к истинному результату при любых значениях параметров.
- Объединение запросов через оператор UNION.
- Комментирование части запроса.
Для того, чтобы обнаружить SQL-инъекции, тестировщику необходимо понимать функциональные требования, триггеры, бизнес-логику, основной сценарий веб-приложения и т. д.
Как выявлять SQL-инъекции
Статья носит информационный характер. Не нарушайте законодательство.
Ручной поиск
Шаг 1.
Во все параметры подставляем спецсимволы (кавычки, двойные кавычки и т.д. ). В первую очередь проверяются параметры, принимающие в качестве аргументов пользовательский ввод. Если при передаче сервер вернул ошибку, то есть подозрение на наличие инъекции. Когда веб-приложение не отреагировало на спецсимволы, то возможны 2 причины:
- SQL-инъекции нет.
- Отключен вывод ошибок на веб-сервере.
http://example.com/?id=1’ http://example.com/?id=1” http://example.com/?id=1’)
Шаг 2.
Если инъекция обнаружена, то используем метод UNION-Based, который применяется, если SQL-инъекция возникает в запросе с использованием оператора SELECT. Благодаря такому методу можно объединить два запроса в один набор результатов. Особенность его заключается в том, что он будет работать только в случае, если количество столбцов, возвращаемых первым запросом, будет равно их количеству, возвращаемых во втором запросе. Для определения количества столбцов можно воспользоваться 3 методами:
-
Добавление столбца при каждой итерации проверки. Это не совсем удобно, так как их может быть бесконечное количество. Пример:
?id=1' union select null -- ?id=1' union select null,null -- ?id=1' union select null,null,null --
и т.д. Поиск количества столбцов


?id=1' order by 20 -- ?id=1' order by 10 -- ?id=1' order by 5 --
и т.д. Проверка с помощью order by



?id=1' group by 5 -- ?id=1' group by 10 -- ?id=1' group by 20 --
Теперь, когда мы знаем, сколько столбцов имеет текущая таблица, используем UNION SELECT, чтобы увидеть, какой столбец уязвим. Уязвимым столбцом будет являться тот, данные которого отображаются на странице.
?id=1’ union select 1,2,3,4 --
Когда уязвимый столбец найден, вместо его названия можем указать полезные команды для сбора информации о СУБД и получения данных из интересующих таблиц:
?id=1’ union select 1,null,version(),null — версия СУБД

?id=1’ union select 1,null,database(),null — текущая база данных

?id=1’ union select 1,null,@@port,null — порт, используемый СУБД

?id=1’ union select 1,null,user(),null — пользователь СУБД

?id=1’ union select 1,null,table_name,null from information_schema.tables – список таблиц с применением information_schema.

Шаг 3.
Если наличие инъекции при подстановке спецсимволов не подтвердилось, то воспользуемся одной из техник поиска слепых инъекций:
Такой метод эксплуатации слепых SQL-инъекций, при котором информация извлекается исходя из реакции на условные выражения. Атака называется «слепой» в тех случаях, когда нет видимой реакции от веб-приложения. Например, при подстановке кавычек в потенциально уязвимый параметр, ошибка, связанная с нарушением логики SQL-запроса, не появляется, а страница отображается без изменений.

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

Существует метод, при котором используются функции СУБД (например, SLEEP), вызывающие задержку ответа от базы данных. Такой способ также применяется для эксплуатации слепых инъекций, когда отсутствует какой-либо вывод информации, в том числе в случаях, описанных в Boolean Based SQL-injection.
?id=1 and sleep(10)
Функция sleep() выполнится на стороне СУБД при условии обращения к записи с соответствующей таблицы. Возможно использование функций BENCHMARK или WAITFOR.
BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')) waitfor delay '00:00:10' (MS-SQL) pg_sleep() (PostgreSQL)
- Stacked Query Based SQL-injections
В SQL точка с запятой указывает на конец запроса, после которого можно начать новый. Это позволяет выполнять несколько операторов в одном вызове сервера базы данных. В отличие от UNION-Based, который ограничен операторами SELECT, составные запросы могут использоваться для выполнения любой процедуры SQL. Стоит также отметить, что не все БД поддерживают эту функцию. Например, при использовании MySQL и SQLite3, нельзя воспользоваться этими операторами запросов, но в PostrgeSQL такая возможность есть.
?id=1; delete from table_name
Автоматизированный анализ
SQLmap — мощный кроссплатформенный консольный инструмент для поиска, эксплуатации SQL-инъекций любого вида и сложности, написанный на языке Python.
Основные функции SQLmap:
- полная поддержка системы управления базами данных (MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB и HSQLDB) и прямое подключение к ним;
- автоматическое распознавание форматов хешей паролей и предложение их подбора с использованием атаки по словарю;
- поддержка выполнения произвольных команд на ОС сервера БД, получение их стандартного вывода при использовании MySQL, PostgreSQL или Microsoft SQL Server и многое другое.
Основные ключи, которые используют при работе с MySQL : —dbs, -D,T,C, —level,—risk, —random-agent.
# sqlmap -u http://example.com/?id=1 --dbs # sqlmap -u http://example.com/?id=1 -D test_db -T test_tables –dump
Дамп пользовательской таблицы


JSQ injection — еще один кроссплатформенный инструмент для выявления SQL-уязвимостей, написанный на языке Java и имеющий графический интерфейс. Этот инструмент поддерживает работу с 33 базами данных (Access, Altibase, Firebird, MemSQL, MySQL, Oracle, PostgreSQL, Presto, SQLite, SQL Server и т.д). По набору функций jSQL injection собрал в себе средство поиска и эксплуатации SQLi, функционал Dirb и Hashcat:
- поддержка различных видов инъекций (стандартные, error-based, stacked-based, blind и time-based);
- создание и внедрение веб-шелла и SQL-шелла;
- аутентификация с использованием Basic, Digest, NTLM и Kerberos;
- прокси-соединение по HTTP, SOCKS4 и SOCKS5;
- кодирование и декодирование текста;
- перебор паролей по хешу и др.
Просмотр содержимого таблиц

SQLmap и jSQL injection поддерживают поиск уязвимостей в cookie. За счет более обширной базы пейлоадов, использование SQLmap при выявлении уязвимостей будет приносить положительный результат намного чаще.
Защита от SQL-инъекций
Встречаются SQL-инъекции в числовом и строковом параметрах в запросах, использующих оператор SELECT, которые являются самыми распространенными. Поэтому проверять нужно всё: числа, строки, даты и другие данные в специальных форматах.
1) Числа
Функция is_numeric(n) используется для проверки переменной на числовое значение, которая вернёт true, если параметр n — число, а в противном случае — false. Также переопределить тип возможно вручную.
if (isset($_GET['id']))
2) Строки
Компрометации через SQL-конструкции происходят и по причине нахождения в строках небезопасных кавычек и других специальных символов. Для предотвращения такой угрозы необходимо использовать функцию addslashes($str), которая возвращает строку $str с добавленным обратным слешем (\) перед каждым специальным символом. Данный процесс называется экранированием. Для этого в PHP используют функцию mysqli_real_escape_string($str).
3) Параметризированные запросы (PDO)
PDO заставляют разработчика сначала определить весь код SQL, а затем передать каждый параметр в запрос. Это позволяет БД различать код и данные независимо от того, что вводится пользователем. Подготовленные операторы гарантируют, что злоумышленник не сможет изменить логику запроса, даже, если атакующий вставляет команды SQL. Правильно параметризированный запрос не позволит базе данных обработать информацию о пользователе, как часть SQL-запроса. Для обхода аутентификации злоумышленник может использовать конструкцию:
аdmin’ or ‘1’=’1
При использовании PDO сначала передается запрос в БД, а потом в него подставляются данные из переменных. Таким образом, за имя пользователя будет приниматься вся строка admin’ or ‘1’=’1, введенная им, что не позволит хакеру проэксплуатировать SQL-инъекцию.
if (isset($_GET['id']))< $id = $_GET['id']; if ( is_numeric($id) == true)< try< $dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $q = "SELECT username FROM users WHERE $sth = $dbh->prepare($q); $sth->bindParam(':id', $id); $sth->execute(); $sth->setFetchMode(PDO::FETCH_ASSOC); $result = $sth->fetchColumn(); print( htmlentities($result) ); …
4) Хранимые процедуры
Объекты базы данных требуют, чтобы разработчик сгруппировал один или несколько операторов SQL в логическую единицу для создания плана выполнения. Последующие исполнения позволяют автоматически параметризовать операторы. То есть, это тип кода, который можно сохранить и многократно использовать в последующем. Когда необходимо выполнить запрос, вместо того, чтобы писать его, можно будет вызвать хранимую процедуру.
5) Использование WAF
Nemesida WAF — универсальное решение, позволяющее блокировать попытки эксплуатации различных типов уязвимостей, в том числе и SQL-инъекции. В основе своей работы Nemesida WAF использует машинное обучение, способное более точно и с минимальным количеством ложных срабатываний, противодействовать атакам на веб-приложение вне зависимости от языка разработки и используемых фреймворков. Также доступна бесплатная версия Nemesida WAF Free
В одной из статей мы рассматривали способы тестирования Nemesida WAF различными инструментами.
Я твой WAF payload шатал
Пару недель назад команда Vulners опубликовала сравнение нескольких популярных WAF. Поймав себя на м.
6) Принцип наименьших привилегий
Нельзя подключать веб-приложения к базе данных, используя учетную запись с привилегированным доступом (только в случае крайней необходимости), так как злоумышленники могут получить доступ ко всей системе. Это позволит минимизировать ущерб от проэксплуатированной уязвимости при ее наличии.
Резюмируя написанное выше, приведем несколько рекомендаций по защите веб-приложений от SQL-инъекций:
- обрабатывайте ввод отдельно и формируйте запрос из безопасных значений;
- создавайте «белые» списки;
- регулярно устанавливайте обновления;
- удаляйте неиспользуемый функционал;
- задавайте конкретные значения названиям таблиц, полей и базам;
- периодически проводите анализ защищенности веб-приложений вручную и с помощью инструментов автоматизации (например, Wapiti)
- используйте средства защиты веб-приложений (WAF).
Следует помнить, что любая успешная атака с использованием SQL-инъекций может привести к утечке персональных данных (данные кредитной карты, личная информация пользователя и др.), несанкционированному доступу к серверу. Все это может повлечь необратимые негативные последствия. Поэтому будьте в курсе основных тенденций в области информационной безопасности, следуйте приведенным выше рекомендациям, оставайтесь здоровыми и защищёнными.
- Блог компании Pentestit
- Информационная безопасность
- Тестирование веб-сервисов
Что такое SQL-инъекции и как им противостоять

SQL-инъекции (SQL injections, SQLi) — самый хорошо изученный и простой для понимания тип атаки на веб-сайт или веб-приложение. Тем не менее, он странным образом остается весьма распространенным и в наши дни. Организация OWASP (Open Web Application Security Project) упоминает SQL-инъекции в своем документе OWASP Top 10 2017 как угрозу номер один для безопасности веб-приложений, и вряд ли положение сильно изменилось за четыре года.
Курс Project Manager.
Впроваджуйте покроковий алгоритм управління проєктами вже зараз. У цьому вам допоможе Павло Харіков — Head of IoT у Veon Group (Kyivstar).
Попасться на SQL-инъекцию — это все равно что в преферансе вистовать «стоя» на девятерной и в первый ход зайти с «голой» семерки или нарваться на «детский мат» в шахматах. Первое случилось с автором этих строк на первом курсе КПИ и стоило ему стипендии за месяц, а второе как минимум дважды происходило на официальных турнирах, согласно онлайн-базе данных. Итак, что же делает этот классический хакерский трюк таким живучим? Давайте разбираться.

Источник уязвимости — язык SQL
Почему вообще возможны SQL-инъекции?
Когда пользователь вводит и отправляет данные на веб-сайте, эти данные попадают в веб-приложение, которое в свою очередь использует эти данные при доступе к БД.
Допустим, у нас есть веб-сайт онлайн-магазина, и пользователь вводит название продукта в строке поиска. Для обращения к данным в реляционных БД используется SQL (structured query language) — специальный язык, похожий на естественный (английский) язык. Этот язык стандартизирован (самый последний стандарт — SQL:2008), и основные его команды одинаковы для разных производителей СУБД — Microsoft, Oracle, MySQL, PostgreSQL и других.
Курс Project Manager.
Впроваджуйте покроковий алгоритм управління проєктами вже зараз. У цьому вам допоможе Павло Харіков — Head of IoT у Veon Group (Kyivstar).
CREATE TABLE Users ( Id int PRIMARY KEY, Name varchar(100) NOT NULL, CreationDate datetime NOT NULL)
Этот запрос (команды в SQL называют запросами, англ. Queries) создает в базе данных таблицу Users (пользователи) с тремя полями — целочисленным идентификатором ( Id ), именем ( Name ) и датой создания записи о пользователе ( CreationDate ).
DROP TABLE Users
Этот запрос удаляет таблицу с пользователями из базы данных (не данные, т.е. строки из таблицы, а саму таблицу; для удаления строк используется запрос DELETE — смотрите ниже):
SELECT Id, Name FROM Users WHERE CreationDate > '2021-01-01'
Читает всех пользователей, созданных после 1 января 2021 года (в СУБД MS SQL Server).
DELETE FROM Users WHERE Id > 10
Удаляет всех пользователей с идентификатором большим 10
UPDATE Users SET CreationDate = ‘2020-12-01’
Устанавливает для всех (поскольку нет условия WHERE ) пользователей дату создания в 1 декабря 2020 года.
Итак, веб-приложение (веб-сайт) для доступа к своим данным использует параметры, введенные пользователем на сайте.
Например, если пользователь ищет на нашем сайте веб-магазина ноутбуки и вводит слово «ноутбук» в строке поиска, то соответствующий запрос может иметь (упрощенный) вид:
SELECT Id, Name, Price FROM Products WHERE Name LIKE 'ноутбук%'
Оператор LIKE и символ подстановки “ % ” (wildcard character) используются для задания условия по подстроке.
Соответственно, фрагмент программы, который формирует этот запрос для выполнения, в простейшем случае формируется из шаблона команды SELECT с подставленным значением пользовательского ввода (C#):
var selectProductQuery = @" SELECT Id, Name, Price FROM Products WHERE Name LIKE '" + productName + "%'";
Атака
Теперь предположим, что пользователь — злоумышленник, и вводит в строке поиска не название продукта, а вредоносный фрагмент SQL-кода, например:
Курс Англійської.
Вивчай англійську прямо зі свого смартфона за допомоги смарт-платформи.
a’; DROP TABLE Products; —
Тогда результирующий запрос будет иметь вид двух последовательных команд и одного комментария:
SELECT Id, Name, Price FROM Products WHERE Name LIKE '%a'; DROP TABLE Products; -- %'
Комментарии в SQL имеют вид:
Итак, что мы видим? Введенный пользователем текст в форме поиска превратил SQL-команду выбора продуктов из таблицы в два запроса: первый — бессмысленный, а второй — вредоносный, удаляющий таблицу продуктов из базы и делающий наше приложение (веб-сайт) нежизнеспособным.
Разумеется, это упрощенный пример, который предполагает, что команда, состоящая из нескольких запросов, будет выполнена как последовательность этих запросов, что данные пользователя не валидируются веб-фреймворком и так далее, но суть любой SQL-инъекции заключается именно в этом: злоумышленник внедряет («впрыскивает» — отсюда и название атаки «инъекция») вредоносный код в обычную форму ввода или в строку адреса, вынуждая веб-приложение произвести саморазрушительные действия или предоставить доступ внешнему атакующему к несанкционированным данным.
Реальные примеры
Наиболее часто применяются два вида атак SQL injection: Boolean-атака (Boolean Based SQLi) и UNION-атака (UNION Based SQLi).
Boolean-атака
В адресной строке браузера вводится запрос вида
Курс Англійської.
Обери викладача за своїми вимогами серед 1100+ фахівців в Englishdom.
Это может заставить бэкенд приложения выполнить SELECT -запрос с всегда истинным условием, что может привести к раскрытию несанкционированных данных.
UNION-атака
Ключевое слово UNION используется для объединения результатов двух и более запросов в один результат.
Например, у нас есть таблица продуктов:
| Id | Name | Price |
| 1 | Ноутбук | 29000 |
| 2 | Карандаш | 2 |
SELECT Id, Name, Price FROM Products UNION SELECT NULL, CURRENT_USER, NULL

Мы получим такой результат (для БД MS SQL Server):Используя оператор UNION , злоумышленник может попытаться атаковать страницу поиска продуктов:
https://example.com/showProduct?id=1′ union select NULL,CURRENT_USER,NULL —
Что при определенном везении может раскрыть ему секретную информацию, такую как имя базы данных, имя пользователя, от которого происходит подключение к БД, и так далее. Понятно, что результат такой атаки может иметь катастрофические последствия для веб-приложения: раскрытие данных пользователей, полное разрушение приложения и его данных.

Защита от SQL-инъекций
Параметризуйте это
Самое главное правило — данные, присылаемые пользователем, не должны участвовать в формировании текста SQL-запроса, во всяком случае напрямую. Достигается это использованием параметризированных (подготовленных) запросов.
Так, вместо подстановки (конкатенации) пользовательского ввода, надо использовать параметры, например, в случае C# вместо фрагмента, рассмотренного ранее:
var selectProductQuery = @" SELECT Id, Name, Price FROM Products WHERE Name LIKE '" + productName + "%'"; command.CommandText = selectProductQuery; var reader = command.ExecuteReader();
Надо использовать следующий код:
command.CommandText = @" SELECT Id, Name, Price FROM Products WHERE Name LIKE @p_productName"; command.Parameters.AddWithValue("p_productName", productName); var reader = command.ExecuteReader();
В этом случае, какой бы текст пользователь не ввел в поле поиска продукта, приложение будет искать этот текст в качестве имени продукта, и если в тексте содержится нерелевантный фрагмент (например, с SQL-выражениями), никакой инъекции не произойдет, и продукт просто-напросто не будет найден.
Используйте хранимые процедуры
С технической точки зрения, это правило идентично предыдущему: пользовательский ввод не используется при динамической генерации SQL-запроса. Код хранимой процедуры неизменный и хранится в самой СУБД, а не в коде приложения.
Используйте белый список валидации
В некоторых случаях невозможно использовать параметризацию запросов.
Например, имя таблицы, из которой происходит выборка ( SELECT ), не может быть параметром, и в этом случае сам текст запроса формируется в зависимости от ввода пользователя.
В таком случае необходимо ограничить список допустимых значений, которые могут прийти от пользователя («белый список»).
Например, если из выпадающего списка веб-формы приходит значение Customers , то мы производим выборку из таблицы Customers , а если значение Supplier » — то из таблицы Suppliers .
Но если придет значение System_Users , которого приходить не должно, то это, скорее всего, значит, что мы имеем дело с злоумышленником , который с помощью Swagger или подобной программы пытается проверить наше приложение на прочность:
switch (param)
Валидируйте пользовательский ввод
Вообще в работе с пользовательским вводом руководствуйтесь принципом «пользователь — всегда потенциальный злоумышленник». Бэкенд не имеет права слепо доверять ничему, что приходит с клиента, даже если клиентское приложение валидирует пользовательский ввод. Злоумышленник может использовать Swagger, автоматические скрипты и другие средства преодоления клиентской валидации.
Поменьше привилегий
Системный пользователь (системная учетная запись), которая осуществляет доступ к данным, должна иметь как можно меньше привилегий на сервере.
Не может быть и речи о том, чтобы этой учетной записи было позволено читать и создавать файлы, не относящиеся к приложению, и производить другие критические с точки зрения безопасности действия.
Проверяйтесь
Всегда полезно проверять свое приложение на устойчивость, в том числе по отношению к SQLi-атакам. Одна из мощнейших и старейших утилит, предназначенных для поиска и устранения SQLi-уязвимостей — https://sqlmap.org/.
Заключение
В статье мы рассмотрели самый простой и самый распространенный тип атаки на веб-сайт — SQL-инъекцию. Давайте отметим основные тезисы:
- Суть атаки заключается в попытке злоумышленника внедрить вредоносный SQL-код через легальный канал ввода (веб-форма, адресная строка браузера).
- Наиболее эффективный способ защиты от SQL-инъекции — не использовать пользовательский ввод при построении SQL-запроса, а только в качестве значения параметров.
- Всегда полезно валидировать (проверять) пользовательский ввод на стороне бэкенда. Пользователь — всегда злоумышленник.
- Sqlmap — проверенное средство выявления SQLi-уязвимостей, и регулярное «обследование» им своего веб-приложения можно только приветствовать.
Ссылки
Качественное видео с дополнительной информаций по теме:
Примеры уязвимостей и противодействия им на разных языках программирования, основанные на чудесном комиксе xkcd: bobby-tables.com.
5 советов по предотвращению атак SQL Injection

Слышали ли вы когда-нибудь о термине SQL-инъекция? Задумывались ли вы, как ее предотвратить? Эти вопросы задают себе многие веб-разработчики. Любой человек может быть уязвим для этой атаки. Но вам не обязательно быть одним из них. Правильные меры предосторожности позволят вам легко защитить свою базу данных от несанкционированного доступа. Очень важно обезопасить потребителей вашего сайта от таких атак, как SQL Injection, чтобы они могли спокойно совершать покупки.
Давайте рассмотрим, что такое атаки SQL-инъекций и 5 советов по предотвращения sql-инъекций.
Что такое атаки SQL Injection?
SQL-инъекция — это атака с внедрением кода, используемая для атаки на приложения, управляемые данными, при которой вредоносные SQL-запросы вставляются в поле ввода для выполнения.
Атаки с использованием SQL-инъекций являются наиболее распространенным типом нарушения безопасности баз данных. SQL (Structured Query Language) — это язык программирования для доступа к базам данных и манипулирования ими. Веб-приложение использует базу данных SQL для хранения, получения и манипулирования данными.
Эти атаки могут возникать, когда злоумышленники посылают команды базе данных, вводя их в поля ввода на веб-сайтах или в веб-приложениях. Цель атаки — изменить или уничтожить информацию, хранящуюся в базе данных, либо по злому умыслу, либо просто ради удовольствия посмотреть, как все горит. Цель злоумышленника — заставить базу данных вести себя непреднамеренно, чтобы из нее можно было извлечь информацию, которая не предназначалась для ее создателей.
Выбираете ли вы MariaDB или MySQL ни одна база данных не может быть полностью защищена от многочисленных тактик современных хакеров. Поэтому необходимо принимать активные меры, чтобы предотвратить их. Для создания надежной цифровой защиты от различных угроз кибербезопасности необходимы инновационные веб-разработчики.
Лучшие советы по предотвращению атак SQL Injection
Атаки с использованием SQL-инъекций можно предотвратить, применяя следующие передовые методы:
Подход с нулевым доверием
A нулевое доверие это подход к безопасности, при котором организация исходит из того, что все пользователи, включая администраторов, внешних партнеров и поставщиков, не заслуживают доверия и являются потенциальными злоумышленниками. Организация должна применять строгий контроль доступа и использования информации.
Это включает в себя устранение или уменьшение зависимости от внешних соединений с базами данных, приложениями или службами.
Хранимые процедуры являются одним из способов минимизации риска атак SQL-инъекций, поскольку они более безопасны, чем динамические SQL-запросы. Однако если хранимые процедуры используются так же, как и динамические запросы, то при тестировании необходимо убедиться в отсутствии уязвимостей в хранимых процедурах.
Ограничить привилегии
При создании новых учетных записей лучше всего назначать только минимально необходимые привилегии, необходимые для правильной работы учетной записи. Например, создайте две разные учетные записи с разными привилегиями, если вам нужна учетная запись, которая может создавать отчеты, но не удалять их. Это усложнит хакерам задачу получения доступа к конфиденциальным данным или захвата учетных записей путем использования уязвимостей в коде приложения или конфигурационных файлах.
Использование хранимых процедур
Хранимые процедуры могут выполнять несколько команд SQL в одном операторе. Они помогают предотвратить атаки SQL-инъекций, поскольку не позволяют пользователям напрямую обращаться к серверу базы данных через поля ввода кода, такие как «имя пользователя» или «пароль». Вместо этого они используют заранее определенные функции, которые могут быть вызваны из кода приложения с использованием параметров, переданных пользователем (разработчиком веб-приложения).
Вот как создать хранимую процедуру в MySQL. Например, у вас есть таблица следующего вида:
| СОЗДАТЬ TABLE ‘зарплата’ ( ’empid’ int ( 11 ) NOT NULL , ‘sal’ int ( 11 ) DEFAULT NULL , PRIMARY KEY ( ’empid’ ) ) ENGINE = InnoDB DEFAULT CHARSET =utf8; |
Таким образом, если злоумышленник попытается внедрить вредоносный код в такой параметр, он потерпит неудачу, поскольку между приложением и вашим сервером базы данных нет соединения. Все происходит локально на вашей машине!
Использование параметризованных запросов
Атаки SQL-инъекций возникают из-за того, что пользовательский ввод используется в SQL-запросах без предварительной санитарной обработки. Одним из способов избежать этого является использование параметризованных запросов — то есть запросов, в которых в строке запроса вместо констант используются переменные. Например:
| SELECT * ИЗ таблица WHERE столбец =? |
| SELECT * ИЗ таблица WHERE столбец = ‘значение’ |
Внедрение многоуровневой безопасности
SQL-инъекции возникают, когда вредоносный код вставляется в SQL-запросы приложения. Затем внедренный код выполняется веб-сервером, в результате чего он возвращает из базы данных данные, которые не были предусмотрены разработчиком.
Для предотвращения подобных атак необходимо применять многоуровневую защиту. Это включает в себя установку брандмауэров и внедрение надежных механизмов аутентификации для всех ваших пользователей — таких как двухфакторная аутентификация (2FA).
Типы атак SQL Injection
Существует три типа SQL-инъекций:
Несанированный ввод — Этот тип SQL-инъекции возникает, когда приложение не фильтрует и не санирует входные данные и использует их непосредственно в запросе, не выполняя проверку или кодирование. Это может привести к непредвиденным последствиям, таким как выполнение неожиданных запросов, вызов функций, которые должны быть ограничены, изменение содержимого таблиц и т.д.
Внеполосная инъекция — Этот тип SQL-инъекции возникает, когда вредоносные данные отправляются в приложение по каналам, отличным от тех, которые предназначены для интерактивного ввода данных пользователем (например, по электронной почте). Сюда могут входить нетекстовые каналы связи, такие как обмен мгновенными сообщениями или загрузка файлов.
Слепая SQL-инъекция — Этот тип SQL-инъекции возникает, когда злоумышленник не может видеть, что происходит за кулисами, поскольку целевая система не выдает никаких сообщений об ошибках, когда в качестве входных данных предоставляются недопустимые значения.
Тесты на инъекции SQL
Тест SQL Injection Test предназначен для проверки уязвимостей SQL-инъекций в веб-приложениях. Он особенно ценен для веб-разработчиков.
Тест на SQL Injection Test — это бесплатная услуга, предоставляемая Фондом OWASP Foundation, которая поможет вам оценить степень защищенности вашего приложения от атак SQL Injection. Тест выявляет все уязвимости SQL Injection, обнаруженные в вашем приложении, а также рекомендации по их устранению.
Sqlmap — это инструмент тестирования на проникновение с открытым исходным кодом, который автоматизирует обнаружение и использование дефектов SQL-инъекций и захват серверов баз данных. Он оснащен мощным механизмом обнаружения, множеством нишевых функций для опытных тестеров проникновения, а также широким спектром переключателей, начиная от отпечатков пальцев базы данных и заканчивая извлечением данных из БД, доступом к базовой файловой системе и выполнением команд в операционной системе через внеполосные соединения.
Заключительные слова
Недостаток знаний — самая распространенная причина атак SQL-инъекций. Очень важно понимать основы запросов и команд базы данных. И как только вы выучите все эти вещи, не менее важно их запомнить!
Важно понять, как происходят эти атаки и что можно с ними сделать, прежде чем запускать приложение. А если вы уже разрабатываете сайт, необходимо время от времени проводить аудит кода, чтобы убедиться в его безопасности. Небольшая профилактика помогает, поэтому будьте внимательны при написании кода, и все будет в порядке.

Менеджер по цифровому маркетингу и написанию контента в PowerDMARC
Ахона работает менеджером по цифровому маркетингу и контент-писателем в PowerDMARC. Она страстный писатель, блогер и специалист по маркетингу в области кибербезопасности и информационных технологий.
Последние сообщения Ахона Рудра (см. все )
- Как найти лучшего поставщика решений DMARC для вашего бизнеса? — 8 ноября 2023 г.
- Предотвращение фишинговых атак в учебных заведениях — 31 октября 2023 г.
- Что такое Security Service Edge (SSE)? — 31 октября 2023 г.
Что такое SQL-инъекция? Определение и описание

Атаки с SQL-инъекцией основаны на одном из старейших классов уязвимостей в веб-приложениях. Они известны ИБ-экспертам с конца 90-х годов, но все еще остаются актуальными. В этой статье мы расскажем, что эти атаки собой представляют, как они работают и как их можно предотвратить.
SQL-инъекция – определение и описание
SQL-инъекция или SQLi – уязвимость, которая позволяет атакующему использовать фрагмент вредоносного кода на языке структурированных запросов (SQL) для манипулирования базой данных и получения доступа к потенциально ценной информации. Атаки на основе таких уязвимостей – одни из самых распространенных и опасных: они могут быть нацелены на любое веб-приложение или веб-сайт, которые взаимодействуют с базой данных SQL (а подавляющее большинство баз данных реализованы именно на SQL).
Как происходят атаки на основе SQL-инъекции?
Чтобы понять принцип действия SQL-инъекции, сначала стоит разобраться, что представляет собой язык SQL. SQL – это язык построения запросов, который применяется в программировании для чтения, изменения и удаления информации, хранящейся в реляционных базах данных. Так как большинство веб-сайтов и веб-приложений взаимодействуют с базами данных SQL, атака на основе SQL-инъекции может нанести серьезный ущерб организации.
SQL-запрос – это запрос, направленный в базу данных для выполнения определенной операции или функции, такой как извлечение данных или исполнение SQL-кода. Например, запрос может осуществлять передачу учетных данных пользователя через веб-форму для доступа к сайту. Обычно подобные веб-формы сконфигурированы таким образом, чтобы принимать только определенные типы данных, такие как имя пользователя и (или) пароль. Введенная информация сверяется с базой данных. Если все совпадает, пользователь сможет войти на сайт. А если нет – в доступе будет отказано.
Ситуация опасна тем, что большинство веб-форм не имеют механизмов, которые бы исключали ввод дополнительной информации в поле. Это дает злоумышленникам возможность передать в базу данных собственные запросы через поля ввода формы. Они могут использовать эту уязвимость в разных преступных целях, начиная с кражи конфиденциальных данных и заканчивая манипулированием сведениями в базе.
Так как подавляющее большинство веб-сайтов и серверов полагаются на базы данных, SQL-инъекции являются одними из самых давних и распространенных видов кибератак. В сообществе киберпреступников появилось несколько разработок, повышающих вероятность таких атак: прежде всего речь идет об инструментах, которые позволяют обнаружить уязвимое место для SQL-инъекции. Соответствующие утилиты представлены в свободном доступе как проекты с открытым исходным кодом. Достаточно нажать нужную кнопку, и за считаные минуты будет реализована атака, позволяющая заполучить доступ к любой таблице или столбцу базы данных.
Симптомы SQLi-атаки
Успешно проведенная атака с SQL-инъекцией может вообще никак себя не проявлять. Тем не менее иногда можно заметить следующие симптомы:
- Получение избыточного числа запросов за короткий промежуток времени. Например, массовый поток электронных писем от формы обратной связи веб-сайта.
- Рекламные блоки, перенаправляющие пользователя на подозрительные веб-сайты.
- Странные всплывающие окна и сообщения об ошибках.
Типы SQL-инъекций
В зависимости от способа получения доступа к данным бэкенд-сервера и потенциальных масштабов ущерба SQL-инъекции можно разделить на три категории:
Внутриполосная атака (In-band SQLi)
Это самый простой вид атаки для злоумышленников, так как для реализации атаки и сбора результатов используется один и тот же канал связи. Этот тип SQLi-атак разделяют на два подвида:
- Атака на основе ошибок (Error-based SQLi). При такой атаке действия злоумышленника приводят к тому, что база данных генерирует сообщение об ошибке. На основе полученных сообщений об ошибках злоумышленник пытается сформировать представление об инфраструктуре базы данных.
- Атака на основе объединения (Union-based SQLi). Атакующий получает необходимые данные путем объединения нескольких инструкций SELECT в единый ответ HTTP с помощью SQL-оператора UNION.
Инференциальная атака (Inferential SQLi, также известна как «слепая SQL-инъекция»)
При таких атаках злоумышленники изучают ответы и поведение сервера после отправки наборов данных, чтобы узнать больше о структуре базы данных. При этом никакие записи из базы данных веб-сайта не передаются злоумышленнику, и он не видит их в том же канале связи, как в случае внутриполосной атаки (этим и объясняется название «слепая SQL-инъекция»). Такие атаки разделяют на два подвида:
- Слепая атака, основанная на времени (Time-based SQLi). Атакующие направляют SQL-запрос к базе данных, вынуждая ее сделать задержку на несколько секунд, прежде чем она подтвердит или опровергнет полученный запрос.
- Булевая слепая атака (Boolean SQLi). Атакующие делают SQL-запрос к базе данных, ожидая получить результат в виде утвердительного или отрицательного ответа.
Внеполосная атака (Out-of-band SQLi)
Такая атака происходит в двух случаях:

- когда атакующие не могут провести атаку и собрать данные через один и тот же канал связи; или
- когда сервер работает слишком медленно или нестабильно, чтобы достичь нужного результата.
Последствия атак на основе SQL-инъекции
Успешная SQLi-атака может нанести серьезный ущерб бизнесу. SQL-инъекция может привести к следующим последствиям:
- Раскрытие конфиденциальных данных. Атакующие могут заполучить конфиденциальную информацию, хранящуюся на SQL-сервере.
- Компрометация целостности данных. Злоумышленники могут отредактировать или удалить информацию в вашей системе.
- Нарушение приватности пользователей. В зависимости от того, какие данные хранятся на SQL-сервере, атака может привести к раскрытию конфиденциальных пользовательских данных – адресов, номеров телефонов и сведений банковских карт.
- Получение злоумышленниками административного доступа к вашей системе. Если у пользователя базы данных есть привилегии администратора, с помощью вредоносного кода атакующий может заполучить доступ к системе.
- Получение злоумышленниками общих прав доступа к вашей системе. Если для проверки имен пользователей и паролей применяются слишком простые SQL-команды, атакующий сможет заполучить доступ к вашей системе, даже не имея действующих учетных данных пользователя. После этого злоумышленник сможет добраться до конфиденциальной информации и изменить ее, создав большие проблемы для вашего бизнеса.
Ущерб от SQLi-атак не только финансовый. Успешная атака может привести к репутационным потерям и утрате доверия клиентов, если произойдет кража персональной информации – имен, адресов, телефонных номеров и данных кредитных карт. Вернуть доверие клиентов гораздо сложнее, чем его потерять.
Примеры SQL-инъекций
За годы существования этого класса уязвимостей от SQLi-атак пострадало множество организаций. Приведем некоторые громкие случаи:
Fortnite, 2019 г.Fortnite – это онлайн-игра с аудиторией, насчитывающей более 350 млн игроков. В 2019 году была обнаружена уязвимость для SQL-инъекции, которая позволила злоумышленникам получить доступ к пользовательским учетным записям. Уязвимость впоследствии закрыли.
Cisco, 2018 г.
В 2018 году была найдена уязвимость для SQL-инъекции в Cisco Prime License Manager. Брешь позволила атакующим заполучить доступ к командной оболочке систем, на которых был развернут диспетчер лицензий Cisco. Компания Cisco впоследствии закрыла эту уязвимость.
Tesla, 2014 г.
В 2014 году специалисты по кибербезопасности заявили об успешном взломе веб-сайта Tesla методом SQL-инъекции – им удалось получить административные привилегии и украсть пользовательские данные.
Вопросы и ответы об SQLi-атаках
Часто задаваемые вопросы об SQLi-атаках:
Что представляет собой атака на основе SQL-инъекции?
Атака на основе SQL-инъекции подразумевает внедрение вредоносного SQL-кода с целью манипулирования серверной базой данных и доступа к закрытой информации. Сюда могут относиться конфиденциальные данные компании, списки пользователей или сведения о клиентах. SQL – это аббревиатура от Structured Query Language (язык структурированных запросов). Иногда понятие «атака с применением SQL-инъекции» сокращают до SQLi.
Что происходит в процессе SQL-инъекции?
С помощью SQLi-атаки злоумышленники могут подменять цифровую личность, изменять существующие данные, извлекать конфиденциальные данные, удалять данные или делать их недоступными, а также получать права администратора сервера базы данных. SQL-инъекция способна нанести серьезный ущерб бизнесу, включая утрату доверия клиентов в случае утечки конфиденциальных данных.
Насколько распространены атаки на основе SQL-инъекции?
Злоумышленники довольно часто прибегают к SQLi-атакам, ведь их относительно просто реализовать, а успешная атака может принести большую прибыль. Однозначной статистики на этот счет нет, но по усредненным оценкам, SQL-инъекции составляют основную часть атак на программные системы. По данным сообщества Open Web Application Security Project, атаки на основе внедрения кода, к которым также относится SQL-инъекция, являлись третьим по значимости риском безопасности для веб-приложений в 2021 году.
Как предотвратить атаку на основе SQL-инъекции?
Вот ключевые принципы, которые помогут компаниям защитить свои веб-сайты и веб-приложения от потенциальной SQL-инъекции:
Проводите тренинги для персоналаПовышайте осведомленность о риске SQLi-атак среди членов команды, отвечающей за ваше веб-приложение, и проводите ролевые тренинги для всех пользователей.
Помните о контроле пользовательского вводаЛюбые пользовательские данные, указанные в SQL-запросе, несут потенциальные риски. До окончания проверки любые адреса, вводимые аутентифицированными и (или) внутренними пользователями, стоит обрабатывать так же, как и поступающие извне данные. Учетные записи, которые подключаются к базе данных SQL, должны обладать только минимально необходимым набором привилегий. По возможности применяйте списки разрешенных, а не запрещенных слов в ходе проверки и фильтрации пользовательского ввода.
Не забывайте об обновленияхДля максимальной защиты важно пользоваться самой последней версией вашей среды разработки, так как в старых версиях могут отсутствовать некоторые современные функции безопасности. Устанавливайте актуальные версии ПО и исправления безопасности сразу после их выпуска.
Проводите регулярные проверки веб-приложений
Пользуйтесь комплексными инструментами управления производительностью приложений. Регулярные проверки веб-приложений позволяют выявить и устранить потенциальные уязвимости до того, как они обернутся серьезными проблемами.
Используйте сетевой экранНередко для отсеивания SQLi-атак и прочих онлайн-угроз применяется сетевой экран веб-приложений (WAF). WAF фильтрует вредоносные SQL-запросы, сравнивая их с объемными и регулярно обновляемыми списками сигнатур. Обычно сигнатуры в этом списке описывают специфические векторы атак. Такой список регулярно обновляется после обнаружения новых уязвимостей.
Другие продукты
- Антивирус Касперского
- Kaspersky Total Security
- Kaspersky Internet Security
- Kaspersky Password Manager
- Kaspersky Secure Connection
Статьи по теме:
- Что такое троянская программа?
- Как модель нулевого доверия приводит к масштабным изменениям в кибербезопасности?
- Что такое защита рабочих мест и как она работает?
- Что такое вредоносные программы с нулевым щелчком?
- Что такое межсайтовые скрипты?
Что такое SQL-инъекция? Определение и описание
SQL-инъекция (внедрение SQL-кода) позволяет злоумышленникам заполучить несанкционированный доступ к базам данных организации и нанести ей ущерб. Узнайте, что такое SQL-инъекция и как она работает.
