SQL-инъекции: полный разбор атак и методов защиты

SQL-инъекции: полный разбор атак и методов защиты

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

Перечень видов SQL инъекций

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

  • Error based. Приложение возвращает пользователю сырые сообщения об ошибках СУБД. Достаточно спровоцировать синтаксическую ошибку через лишнюю кавычку или некорректное выражение чтобы в ответе появилось сообщение с именами таблиц типами столбцов и фрагментами исходного запроса. Такой тип инъекции часто используется как первая ступень разведки структуры базы данных и особенностей конкретного SQL диалекта.
  • Union based. Атакующий добавляет к исходному запросу оператор UNION который, объединяет легитимный результат с произвольной выборкой например из таблицы пользователей. Важная особенность оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных поэтому на этапе тестирования подбираются варианты конструкции UNION пока приложение не начнет выводить дополнительные строки. При успешной эксплуатации чувствительные данные попадают напрямую в область вывода страницы.
  • Boolean based blind. Приложение не показывает ошибки и не выводит результаты запросов, но изменяет содержимое страницы в зависимости от истинности выражения в условии. Тестировщик отправляет пару запросов например с добавлением AND 1=1 и AND 1=2 и сравнивает ответ. Если в одном случае часть содержимого исчезает или меняется статус ответа, значит параметр влияет на условие выборки и можно по шагам восстанавливать значения интересующих полей задавая вопросы базе в виде логических выражений.
  • Time based blind. Используется в ситуациях когда содержимое ответа стабильно и не меняется даже при разных условиях. В этом случае в инъекцию добавляют вызовы функций задержки выполнения запроса. Если условие истинно база ждет заданное время перед отправкой результата, если ложно ответ приходит сразу. Измеряя время ответа для последовательности таких запросов, что дает возможность по битам или символам извлекать данные хотя процесс занимает больше времени и создает дополнительную нагрузку на систему.
  • Out of band. Приложение не дает ни содержательных ошибок ни заметных различий во времени ответа, но СУБД или расширения позволяют инициировать внешние сетевые взаимодействия. Вредоносный запрос заставляет базу выполнить DNS запрос или HTTP обращение к домену контролируемому исследователем и факт такого обращения становится подтверждением инъекции. Через параметры этих запросов можно передавать небольшие фрагменты данных например хэши или части конфигурации, что особенно актуально для ограниченных и сильно фильтруемых сред.
  • Вторичная SQL инъекция. Опасность появляется не в момент первоначального ввода, а позже когда сохраненные данные используются в другом контексте. Приложение принимает пользовательскую строку и записывает ее в базу как обычные данные и на этом этапе явных признаков уязвимости нет. На последующих шагах эта строка без экранирования подставляется в новый SQL запрос или в динамически формируемую часть отчета и начинает интерпретироваться как код. Такие инъекции сложно обнаружить простыми сканерами поэтому для их предотвращения особенно важны строгая параметризация и единые политики обработки данных на всех этапах жизненного цикла веб приложения.

Механизм формирования уязвимого запроса

В простейшей схеме аутентификации приложение ожидает логин и пароль и строит запрос к таблице пользователей примерно так как представлено в примере:

login = request["login"]
password = request["password"]

query = "SELECT * FROM users WHERE login = '" + login + "' AND pass_hash = '" + password + "'" 

Если вместо логина ввести строку ' OR 1=1 -- условие в секции WHERE становится всегда истинным и приложение может авторизовать первого пользователя в таблице или вернуть все записи. Таким образом пользовательский ввод превращается во фрагмент языка SQL, и оставляет брешь, открывая доступ к конфиденциальной информации практически каждому, кто обладает минимальным знанием применения SQL inj..

Инструменты и лучшие практики обнаружения с помощью sqlmap

Ручное тестирование на наличие SQL inj. начинается с отправки одиночных кавычек измененных чисел и простых логических выражений в параметры запросов с анализом ошибок и изменений в ответах. Для облегчения процесса и создания контролируемой среды при модификации запросов используют прокси Burp Suite или OWASP ZAP которые перехватывают и переотправляют запросы.

В реальных тестированиях на проникновение широко применяют инструмент sqlmap. Инструмент автоматически подбирает полезные нагрузки, определяет тип инъекции и при наличии разрешения перечисляет структуру базы данных. Установка в среде на базе Unix выполняется из официального репозитория проекта:

git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python3 sqlmap.py -u "https://target.example/item?id=1" --batch --risk=1 --level=1

Запуск с минимальными настройками отражает аккуратную начальную проверку, он задает цель через параметр "id" и ограничивает глубину и риск чтобы не нагружать систему.

При необходимости и условии, что известна СУБД можно сузить область исследования указывают тип используемой базы данных, а так же имя целевой базы данных:

python3 sqlmap.py -u "https://target.example/item?id=1" --batch --dbms=PostgreSQL -D app_db --tables

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

python3 sqlmap.py -u "https://target.example/item?id=1" --batch --dbs

Обратите внимание: К лучшим практикам при тестировании относится запуск sqlmap через настроенный прокси чтобы действия фиксировались в журналах безопасности осознанный выбор параметров level и risk и строгая правовая рамка тестирование допустимо только по согласованию с владельцем ресурса.

Check Risk WAF SaaS — облачная защита веб-приложений и инфраструктуры
Check Risk WAF — защита веб-приложений и API

Блокирует SQLi, XSS, L7‑DDoS и вредоносных ботов. Подключение без изменений кода вашего веб-приложения, события и отчёты — из одного кабинета.

  • Система обнаружения атак
  • Кастомные правила
  • Защита от бот‑трафика и сканеров
  • Пилотное тестирование — бесплатно

Последствия и оценка риска

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

Методы предотвращения и снижения риска

Ключевой принцип защиты от SQL инъекций строгий разрыв между кодом и данными. Для этого используются параметризованные запросы и подготовленные выражения. Структура запроса фиксирована, а значения параметров передаются отдельно и интерпретируются только как данные. Пример:

query = "SELECT * FROM users WHERE login = %s AND pass_hash = %s"
cursor.execute(query, (login, password_hash))

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

Даже при соблюдении всех перечисленных мер остаются риски ошибок реализации поэтому поверх приложений целесообразно применять веб экран приложений Web Application Firewall. Современные WAF решения анализируют входящие HTTP запросы выявляя характерные шаблоны SQL инъекций по сигнатурам по аномалиям в структуре параметров и по отклонениям в поведении клиента, что позволяет блокировать попытки эксплуатации на периметре.

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

web
830
16.11.2025 18:00
ИП Елисеев Иван Владимирович
ИНН: 236401038208
Свидетельство о государственной регистрации программы для ЭВМ № 2026683774 от 04 августа 2026 г.
Продукт включен в реестр Российского ПО. Реестровая запись №32239 от 17.02.2026 г.
Регистрационный номер оператора, осуществляющего обработку персональных данных: 23-26-176186