Что такое SQL-инъекция?sql-52

SQL-инъекция — это опасная уязвимость веб-приложений, которая позволяет злоумышленнику внедрять произвольный SQL-код в запросы к базе данных. Это происходит, когда приложение некорректно обрабатывает пользовательский ввод.

Как работает SQL-инъекция

Базовый пример уязвимого кода

-- Опасный способ формирования запроса
DECLARE @userInput NVARCHAR(100) = 'admin'' OR ''1''=''1';
DECLARE @sql NVARCHAR(MAX) =
    'SELECT * FROM Users WHERE username = ''' + @userInput + ''' AND password = ''' + @password + '''';
EXEC sp_executesql @sql;

Результат запроса:

SELECT * FROM Users WHERE username = 'admin' OR '1'='1' AND password = 'any_password'

Последствие: злоумышленник получает доступ без валидного пароля.

Типы SQL-инъекций

  1. Классическая инъекция через пользовательский ввод

    • Внедрение через формы авторизации, поиска и т.д.
  2. Инъекция через HTTP-заголовки

    • User-Agent, Cookies, Referer могут использоваться для атаки
  3. Слепая SQL-инъекция (Blind SQLi)

    • Когда приложение не возвращает ошибки, но поведение системы меняется
  4. Инъекция второго порядка

    • Данные сохраняются и выполняются позже

Опасные последствия

  1. Несанкционированный доступ

    • Обход аутентификации
    • Повышение привилегий
  2. Утечка данных

    • Получение всей БД через UNION-атаки
    ' UNION SELECT username, password FROM Users --
    
  3. Изменение данных

    • UPDATE, DELETE, DROP TABLE и другие деструктивные операции
  4. Выполнение команд ОС

    • Через xp_cmdshell в SQL Server
    '; EXEC xp_cmdshell 'format C:' --
    

Методы защиты

1. Использование параметризованных запросов

-- Безопасный подход
DECLARE @username NVARCHAR(50) = @userInput;
SELECT * FROM Users WHERE username = @username;

2. Хранимые процедуры

CREATE PROCEDURE GetUser
    @username NVARCHAR(50)
AS
BEGIN
    SELECT * FROM Users WHERE username = @username;
END

3. Экранирование спецсимволов

  • Замена кавычек: '''
  • Использование встроенных функций экранирования

4. Принцип минимальных привилегий

  • Запрет учетной записи приложения на выполнение опасных операций

5. Валидация ввода

  • Белые списки допустимых символов
  • Проверка типов данных

6. ORM-библиотеки

  • Использование Entity Framework, Hibernate и т.д.

Примеры атак

  1. Обход аутентификации:

    Ввод: admin' --
    Запрос: SELECT * FROM Users WHERE username = 'admin' --' AND password = ''
    
  2. Извлечение данных:

    Ввод: ' UNION SELECT name, type FROM sysobjects --
    
  3. Использование временных задержек для слепой инъекции:

    '; IF (SELECT COUNT(*) FROM Users) > 100 WAITFOR DELAY '0:0:5' --
    

Инструменты для тестирования

  1. SQLmap — автоматизированный инструмент тестирования
  2. OWASP ZAP — комплексный сканер уязвимостей
  3. Burp Suite — инструмент для ручного тестирования

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