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.