SQL-инъекция (SQLi) — атака на веб-приложение, при которой вредоносный ввод встраивается в запрос к базе данных, и атакующий читает, меняет или удаляет данные без права доступа к ним.
Как работает SQL-инъекция
Уязвимость возникает, когда приложение собирает SQL-запрос, просто вставляя в его текст данные пользователя. Допустим, форма входа выполняет SELECT * FROM users WHERE name = 'ввод'. Тогда ввод ' OR '1'='1 меняет логику запроса.
Разновидности:
- классическая (in-band) — результат виден прямо на странице (через ошибки или UNION);
- слепая (blind) — данные вычисляются по ответам «да/нет» или по задержкам ответа;
- внеполосная (out-of-band) — данные отправляются на сервер атакующего.
При подходящей СУБД и правах SQLi позволяет не только украсть данные, но и записать файлы, вплоть до удалённого выполнения кода. Поиск и эксплуатацию автоматизируют инструменты вроде sqlmap.
Почему SQL-инъекции опасны
Это одна из старейших веб-уязвимостей, и она по-прежнему входит в категорию «Инъекции» OWASP Top 10. Из-за SQLi происходили крупные утечки:
- атака на Heartland Payment Systems в 2008 году раскрыла более 100 млн номеров карт;
- в 2023 году группировка Cl0p через SQL-инъекцию в MOVEit Transfer (CVE-2023-34362) похитила данные тысяч организаций.
Как предотвратить
- Используйте параметризованные запросы (prepared statements) или безопасный ORM. Никогда не склеивайте ввод с SQL.
- Выдавайте учётной записи приложения в базе только необходимые права.
- Проверяйте входные данные, не показывайте пользователям подробные ошибки СУБД, тестируйте код инструментами SAST/DAST.
- Межсетевой экран веб-приложений (WAF) полезен как дополнительный слой, но не заменяет исправление кода.