Что такое SQL-инъекция

Обложка статьи: Что такое SQL-инъекция

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

В 1979 году компания Oracle разработала поисковый инструмент, который напоминал Excel. Он использовался для работы с данными. Со временем этот инструмент стал языком программирования SQL (Structured Query Language) и теперь повсеместно используется для создания баз данных и разработки сайтов.

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

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

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

Когда все тот же пользователь (которому нужен недорогой коврик для мыши), задает фильтр, интернет-магазин отправляет запрос к базе данных (где хранится вся информация о товарах). Этот запрос похож на инструкцию: «покажи все коврики для мыши, которые стоят не дороже 1 000 рублей». База данных выполняет команду и возвращает результат — подходящий список товаров.

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

Приложение интернет-магазина не проверяя ввод, подставит эту фразу в запрос к базе данных. В результате инструкция изменится: и уже вместо «покажи коврики до 1 000 рублей» получится «покажи коврики до 1 000 рублей или покажи все, что есть».

Тогда база данных выдаст:

  • все коврики (даже дороже 1 000 рублей);
  • возможно, товары из других категорий;
  • иногда — скрытую информацию (например, закупочные цены).

Если злоумышленник предпримет более агрессивные действия и введет команду наподобие «1000; удали всю таблицу», последствия будут серьезными. При отсутствии должной защиты сайт не распознает угрозу — и база данных выполнит вредоносный запрос. В результате весь каталог товаров может быть безвозвратно удален.

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

1. Внутриполосная атака

Один из самых простых видов SQL‑инъекций, при котором злоумышленник использует один канал связи как для внедрения вредоносного кода, так и для получения результата. Атакующий вводит вредоносный код в форму запроса, система выполняет его, после чего раскрывает данные или позволяет управлять всей базой.

Пример атаки «Подрыв логики приложения»

Исходный запрос для входа:
sql
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

Атака: ввод в поле username:
administrator' --

Результат:
sql
SELECT * FROM users WHERE username = 'administrator' --' AND password = ''

Негативный эффект: проверка пароля отбрасывается, вход выполняется как administrator.

2. Внеполосная атака

Здесь атакующий напротив не использует один и тот же канал для внедрения кода и получения результатов. Вместо этого хакер заставляет сервер базы данных отправить данные по стороннему каналу (HTTP, DNS или другому) на подконтрольный ему ресурс.

3. Слепая атака

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

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

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

  • Странные параметры в логах, содержащие кавычки, комментарии, ключевые слова SQL: union, select, drop. 
  • Резкое увеличение объема сетевого трафика к базе данных
  • Подозрительные внешние DNS/HTTP-запросы от сервера баз данных — чаще всего при внеполосных атаках.
  • Внеплановое изменение прав пользователей, добавление новых записей, изменение паролей. 
  • Обнаружение нестандартного или зашифрованного кода в базе данных. 

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

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

  • Федеральный закон от 27.07.2006 № 152‑ФЗ «О персональных данных» — обязывает операторов принимать меры по защите персональных данных от несанкционированного доступа. Утечка данных через SQL‑инъекцию расценивается как нарушение закона.
  • КоАП РФ, статья 13.11 — устанавливает административную ответственность (в том числе крупные штрафы) за нарушение порядка обработки и защиты персональных данных, включая их неправомерную передачу вследствие уязвимостей.
  • УК РФ, статья 272.1 — предусматривает уголовную ответственность за незаконное использование, передачу, сбор и хранение персональных данных, полученных через уязвимости (в том числе и SQL‑инъекции).

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

  1. Всегда отслеживайте обновления и устанавливайте актуальные версии серверного ПО, библиотек и CMS. 
  2. Регулярно проверяйте производительность приложений с помощью комплексных инструментов. Например, Apache JMeter, Gatling или SQLMap.
  3. Используйте WAF, который с помощью соответствующих настроек будет фильтровать вредоносные SQL-запросы. 
  4. Тщательно проверяйте данные, вводимые пользователями — независимо от того, поступают ли они от авторизованных или внутренних пользователей. Кроме того, учетные записи, имеющие доступ к SQL‑базе данных, следует наделить ограниченными правами, достаточными для выполнения их прямых задач.
  5. Изучите официальные документы и руководства по борьбе с SQL-инъекциями от OWASP: Annotated Application Security Verification Standard (AASVS)SQL Injection Prevention Cheat SheetQuery Parameterization Cheat SheetOWASP Top 10 и другие. Эти документы содержат комплексную информацию о SQL-инъекциях, их типах, методах обнаружения и предотвращения.