SQL-инъекция
Что такое SQL-инъекция?
SQL-инъекцияАтака внедрения кода, которая встраивает управляемый злоумышленником SQL в запрос к базе данных, позволяя читать, изменять или уничтожать данные.
SQL-инъекция (SQLi) использует приложения, которые конкатенируют недоверенный ввод в SQL-выражения вместо параметризованных запросов. Вставляя кавычки, комментарии или конструкции UNION, злоумышленник переписывает исходный запрос: выгружает таблицы, обходит аутентификацию, повышает привилегии или выполняет команды на уровне СУБД. Среди разновидностей — классическая внутрипотоковая (in-band), основанная на ошибках, слепая булева/временная (вывод данных по одному биту из ответов или задержек ответа) и второпорядковая, когда сохранённый ввод срабатывает при последующем повторном использовании.
SQLi насчитывает десятилетия, но по-прежнему разрушительна. CVE-2023-34362 — SQL-инъекция нулевого дня в Progress MOVEit Transfer — с конца мая 2023 года эксплуатировалась группой шифровальщиков Cl0p: неаутентифицированные злоумышленники внедряли SQL, чтобы развернуть веб-шелл LEMURLOOT и выгрузить содержимое базы данных, что каскадно затронуло тысячи нижестоящих организаций. Утечка данных TalkTalk в 2015 году, раскрывшая около 157 000 записей клиентов, также была SQL-инъекцией против устаревшей веб-страницы. SQLi относится к категории OWASP Top 10 A03:2021 (Injection).
Основная мера защиты — параметризованные запросы / подготовленные выражения (prepared statements), которые отделяют код от данных, так что ввод никогда не может изменить структуру запроса. Дополните это безопасным использованием ORM-фреймворков, валидацией ввода по белому списку, учётными записями СУБД с минимальными привилегиями (без прав DBA для логинов приложения), гигиеной хранимых процедур и WAF как эшелонированной защитой. Ручное экранирование само по себе ненадёжно и не рекомендуется.
flowchart TD
U["Недоверенный ввод"] --> C{"Как строится запрос?"}
C -->|"Конкатенация строк"| I["' OR 1=1 -- внедрено в SQL"]
I --> DB[("База данных выполняет SQL злоумышленника")]
DB --> X["Выгрузка данных / обход аутентификации"]
C -->|"Параметризованный запрос"| S["Ввод привязан как данные, а не код"]
S --> OK["Структура запроса сохранена — безопасно"]● Примеры
- 01
Форма входа, где ввод ' OR '1'='1 возвращает первого пользователя и обходит аутентификацию.
- 02
Эндпоинт отчётов, в котором подобранный параметр запускает UNION SELECT и приводит к утечке хешей паролей.
● Частые вопросы
Что такое SQL-инъекция?
Атака внедрения кода, которая встраивает управляемый злоумышленником SQL в запрос к базе данных, позволяя читать, изменять или уничтожать данные. Относится к категории Атаки и угрозы в кибербезопасности.
Что означает SQL-инъекция?
Атака внедрения кода, которая встраивает управляемый злоумышленником SQL в запрос к базе данных, позволяя читать, изменять или уничтожать данные.
Как защититься от SQL-инъекция?
Защита от SQL-инъекция обычно сочетает технические меры и операционные практики, как описано в определении выше.
Какие есть другие названия SQL-инъекция?
Распространённые альтернативные названия: SQLi.