SQL-инъекция
Атака, при которой злоумышленник вводит в поле формы фрагмент SQL-кода, и база данных выполняет его как часть запроса.
SQL-инъекция — одна из самых известных атак на приложения, работающие с базами данных. Она возможна, когда программа собирает SQL-запрос, просто вставляя в его текст то, что ввел пользователь. Тогда злоумышленник вводит не имя или пароль, а кусок SQL-кода — и база данных выполняет его. Результат — обход входа, кража всей базы клиентов, изменение или удаление данных.
Как это происходит
Уязвимый код проверки входа:
# Python
query = "SELECT * FROM users WHERE login = '" + login + "' AND password_hash = '" + password_hash + "'"
Если в поле логина ввести admin' --, запрос превратится в
-- SQL
SELECT * FROM users WHERE login = 'admin' --' AND password_hash = '...'
Два дефиса в SQL начинают комментарий, проверка пароля отбрасывается, и злоумышленник входит под администратором. Похожим образом можно дописать к запросу другой запрос и выгрузить чужие таблицы.
Главная защита — параметризованные запросы
# Python
cursor.execute(
"SELECT * FROM users WHERE login = %s AND password_hash = %s",
(login, password_hash),
)
Текст запроса и данные передаются в базу отдельно. Что бы ни ввел пользователь, база воспримет это как значение, а не как часть команды. Так же работают подготовленные запросы (prepared statements) и ORM: если не обходить их ручной сборкой строк, инъекция не срабатывает.
Дополнительные меры
- Минимальные права в базе. Приложение подключается к базе пользователем, который не может удалять таблицы и читать то, что ему не нужно. Даже успешная атака тогда ограничена.
- Проверка входных данных. Номер заказа должен быть числом, дата — датой; неожиданный формат отклоняется сразу.
- Осторожность с динамическими частями. Имена таблиц и колонок, порядок сортировки нельзя передать параметром — их выбирают из заранее заданного списка допустимых значений.
- Межсетевой экран для веб-приложений (WAF) блокирует типовые попытки атаки — подробнее в термине «Брандмауэр». Но это страховка, а не замена правильному коду.
- Проверка кода и тестирование. Код-ревью, автоматические анализаторы и тесты на проникновение находят уязвимые места до злоумышленников.
Почему атака до сих пор актуальна
Инъекции десятилетиями входят в список главных рисков веб-приложений OWASP Top 10. Новые проекты на современных фреймворках защищены по умолчанию, но уязвимости живут в старом коде, самописных отчетах и местах, где разработчик «на минутку» собрал запрос строкой. Родственная атака на страницы сайта, а не на базу данных, — XSS.