SQL-инъекции: как распознать и защититься

erid: 2SDnjcbfz1H
SQL-инъекции: как распознать и защититься
SQL-инъекции: как распознать и защититься
10.05.2023

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

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

Сергей Полунин

Руководитель группы защиты инфраструктурных ИТ компании «Газинформсервис»

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

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

Типы инъекций

Традиционно принято выделять 3 вида инъекций-SQL: классическая SQL-Injection, слепая SQL-Injection и out-of-band-Injection (атака, осуществляемая только путем превышения емкости сокета, открытого между клиентом и сервером). Каждая из них делится на подтипы, также атаки при помощи SQL-инъекции бывают смешанные.

SQL-Injection делят по способам эксплуатации:

  1. SQL injection union — атака производится при помощи использования SQL-оператора Union для объединения нескольких таблиц и получения данных из смежных таблиц (напрямую туда доступа нет).
  2. SQL-injection boolean — называют слепой инъекцией. Здесь система управления базами данных не выдает как таковых ошибок, а запрос конструируется так, чтобы, например, наблюдать за задержкой выполнения вводимых команд. Информация извлекается исходя из реакции на условные выражения.
  3. Слепая SQL-injection на основе булевых операций (или инференциальная SQL-инъекцией) – в параметр HTTP-запроса передаются несколько допустимых утверждений, результатом которых является true и false. Сравнивая страницу ответа между обоими условиями, атакующий может сделать вывод о том, была ли инъекция успешной или нет.
  4. Временная слепая SQL-injection (иногда называют полной слепой SQL-injection) – в параметр HTTP-запроса передаются специальные SQL-запросы, которые заставляют базу данных приостановиться на определенный период времени. Сравнивая время отклика между обычными запросами и с различными временными интервалами, атакующий может определить, было ли выполнение SQL-запроса успешным.
  5. SQL-injection error based — атака, нацеленная на получение ошибки от баз данных, чтобы атакующий смог сформировать представление об их архитектуре.

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

Внедрение SQLi в веб-приложение имеет следующие признаки:

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

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

Как защититься от SQL-инъекций

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

Евгений Андрюхин

Специалист по тестированию на проникновение Awillix

Атаку на основе SQL-инъекции не предотвратить на 100%, это как Чеховское ружье. Если кто-то написал include <sqllite.h>, значит оно рано или поздно выстрелит, как и любой third-party продукт. Поэтому надо ревьюить патчи, делать taint-анализ потоков данных, закупать WAF и локальные анализаторы поведения хостов. И всё равно вам это не поможет, но вы хотя бы отловите 1-day скрипты, которые используют тупые методы форкования типа runtime.exec("cmd.exe -c 'net user Vasyan 1q2w3e4f /add'").

Чтобы предотвратить атаку на основе SQL-инъекции или затруднить ее проведение, необходимо:

  • на постоянной основе обновлять ПО, чтобы исключить наличие уязвимостей;
  • использовать WAF – межсетевые экраны для защиты веб-приложений, а также системы обнаружения вторжений IDS/IPS;
  • ограничить доступ к базам данных, предоставив его только тем пользователям и сервисам, которым он нужен для работы;
  • проводить проверку на корректность и безопасность вводимых пользователем данных. Например, проверять то, что введенное значение является числом или строкой, исключая специальные символы, которые могут быть использованы в SQL-инъекциях;
  • использовать параметризованные запросы. Это означает, что в запросах используются параметры вместо конкретных значений. Такой подход позволяет избежать внедрения вредоносного кода, поскольку параметры в запросе интерпретируются как данные, а не как код.

Основная идея предотвращения атаки на основе SQL-инъекции заключается в том, чтобы фильтровать то, что веб-приложение пересылается в систему управления базами данных. Запросы должны быть строго формализированы и грамотно ограничены. Плюс очень полезным оказывается использование специализированный межсетевых экранов уровня приложений – Web application firewall. Они как раз предназначены для защиты от различных типов атак на веб-приложения, в том числе и инъекции. Как правило, они уже содержат сигнатуры для типовых способов эксплуатации этой уязвимости.

Примеры из жизни

Так как большинство веб-приложений использует SQL-язык, количество громких примеров кибератак на основе SQL-инъекций достаточно. Часто этот вид атак используют в комплексе с другими. Так, в 2013-2014 годах Yahoo столкнулся с серией атак, включая SQL-инъекции, в результате чего были украдены личные данные более чем 3 миллиардов пользователей.

Антон Кузнецов

Ведущий инженер информационной безопасности R-Vision

Один из ярких примеров применения SQL-инъекций – атаки, нацеленные на сайты под управлением WordPress. В прошлом году самым громким случаем стало наличие SQL-уязвимости у более чем 500 тысяч сайтов на базе этой платформы, в этом году уязвимыми оказались уже 70 тысяч сайтов. Еще один из громких примеров – в 2017 году компания Equifax, крупнейший кредитный бюро в США, была подвергнута масштабной кибератаке, в результате которой были скомпрометированы данные более чем 140 миллионов человек. Один из методов атаки была SQL-инъекция, которая позволила хакерам получить доступ к базе данных компании.

В 2015 году TalkTalk, британский провайдер интернет-услуг, был атакован злоумышленниками, которые использовали SQL-инъекцию. В результате были украдены личные данные более чем 150 000 клиентов, включая данные банковских карт.

Евгений Андрюхин

Специалист по тестированию на проникновение Awillix

SQL-инъекция интересна сама по себе в силу обширности своего применения. Сложно представить себе условия, в которых не было бы использования баз данных. Традиционно принято начинать поиск SQL-инъекций в веб-приложениях – есть огромное количество историй с названием «SQL to RCE». Даже будучи одной из самых изученных проблем, SQL-Injection до сих пор часто встречается в Security Bullet-in'ах серьезных продуктов. Одна из самых больших проблем это возможность адаптации атаки под конкретный продукт с целью обхода WAF.

В 2007 году произошел The Little Bobby Tables incident. Была опубликована статья в блоге xkcd, в которой описывалась SQL-инъекция, которая могла бы произойти, если бы у пользователя было имя «Robert»); DROP TABLE Students;--". Этот пример стал очень популярным и даже получил свою собственную страницу в документации SQLite.

Заключение

Как и от любой другой сетевой атаки, защититься от нападения на основе SQL-инъекций на 100% невозможно. Никто не может гарантировать полную безопасность, но можно проследить за наличием уязвимостей в своей системе.

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


Популярные публикации

Комментарии 0