Учебное пособие по SQL-инъекциям: узнайте на примере

⚡ Умное резюме

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

  • ???? Определение: SQL-инъекция — это внедрение вредоносного SQL-кода в запрос через непроверенное поле ввода.
  • 🔓 Влияние: Успешная атака может обойти систему авторизации и позволить читать, изменять или удалять записи.
  • 🧪 Пример: Условие "всегда истинно" плюс комментарий превращают проверку авторизации в обходной путь.
  • 🇧🇷 Инструменты: SQLMap и jSQL автоматизируют обнаружение и использование параметров, допускающих внедрение зависимостей.
  • 🛡️ Профилактика: Параметризованные запросы, проверка входных данных и учетные записи с минимальными привилегиями позволяют устранить этот пробел.
  • 🤖 Современный стиль: Сканеры и межсетевые экраны, работающие на основе искусственного интеллекта, выявляют схемы внедрения кода, которые не обнаруживаются с помощью стандартных сигнатур.

Учебное пособие по SQL-инъекциям

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

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

Данные — один из важнейших компонентов информационных систем. Веб-приложения, работающие на основе баз данных, используются организациями для получения данных от клиентов. SQL — это аббревиатура от Язык структурированных запросовОн используется для извлечения и обработки данных в базе данных.

Схема того, как SQL-инъекция манипулирует динамическим запросом к базе данных.

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

Типы атак, которые можно выполнить с помощью SQL-инъекций, различаются в зависимости от типа используемой базы данных. Атака работает с динамическими SQL-запросами. Динамический запрос — это запрос, который генерируется во время выполнения с использованием параметров, передаваемых из веб-формы или строки запроса URI.

Пример SQL-инъекции

Рассмотрим простое веб-приложение с формой авторизации. Код HTML-формы показан ниже.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

ВОТ,

  • Приведенная выше форма принимает адрес электронной почты и пароль, а затем отправляет их на сервер. PHP файл с именем index.php.
  • Есть возможность сохранять данные о сессии входа в систему в cookie. Мы сделали этот вывод из флажка remember_me. Для отправки данных используется метод POST. Это означает, что значения не отображаются в результатах поиска. URL.

Предположим, что на стороне бэкэнда для проверки идентификатора пользователя используется следующий текст.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

ВОТ,

  • Приведенный выше оператор напрямую использует значения массива $_POST[] без их очистки.
  • Пароль хешируется с использованием алгоритма MD5.

Мы проиллюстрируем атаку SQL-инъекции, используя SQL Fiddle, Открой URL http://sqlfiddle.com/ в вашем веб-браузере. Вы получите следующее окно.

Примечание: вам потребуется написать SQL-запросы.

пустой SQL Fiddle Окно готово для отображения схемы и запроса.

Шаг 1) Введите этот код в левой панели.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Шаг 2) Нажмите «Создать схему».

Шаг 3) Введите этот код в правой панели.

select * from users;

Шаг 4) Нажмите кнопку «Выполнить SQL». Вы увидите следующий результат.

SQL Fiddle Результат, показывающий возвращенную запись единственного пользователя.

Предположим, пользователь указывает admin@admin.sys и пароль 1234. В этом случае будет выполнена следующая инструкция к базе данных:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Приведенный выше код можно использовать для взлома, закомментировав часть, отвечающую за пароль, и добавив условие, которое всегда будет истинным. Предположим, злоумышленник вводит следующие данные в поле адреса электронной почты.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx для пароля.

Сгенерированный динамический оператор будет следующим.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

ВОТ,

  • ххх@xxx.xxx Заканчивается одинарной кавычкой, которая завершает строку цитаты.
  • OR 1 = 1 LIMIT 1 — это условие, которое всегда будет истинным и ограничивает возвращаемые результаты только одной записью.
  • — ' AND … — это комментарий SQL, который исключает часть пароля.

Скопируйте приведенный выше SQL-запрос и вставьте его в... SQL Fiddle В текстовом поле "Выполнить SQL" отображается текст, как показано ниже.

SQL Fiddle возвращаем запись после выполнения введенного условия

Хакерская деятельность: внедрение SQL в веб-приложение

У нас есть простое веб-приложение по адресу http://www.techpanda.org/ Этот код уязвим для SQL-инъекций и представлен исключительно в демонстрационных целях. Приведенный выше HTML-код формы взят со страницы входа в систему. Приложение обеспечивает базовую безопасность, например, проверку поля электронной почты. Это означает, что наш код не может быть использован для обхода авторизации.

Чтобы обойти это ограничение, мы используем поле пароля. На приведенной ниже схеме показаны необходимые шаги.

Блок-схема этапов внедрения поля ввода пароля в форму входа в систему.

Предположим, злоумышленник предоставляет следующие входные данные.

  • Шаг 1: Введите xxx@xxx.xxx в качестве адреса электронной почты.
  • Шаг 2: Введите xxx') ИЛИ 1 = 1 — ]

Форма входа с использованием строки внедрения, введенной в поле пароля.

  • Нажмите на кнопку Отправить.
  • Вы будете перенаправлены на панель управления.

Сгенерированный SQL-запрос будет выглядеть следующим образом.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Приведенная ниже диаграмма иллюстрирует процесс формирования данного утверждения.

Подробное описание процесса генерации внедренного SQL-запроса.

ВОТ,

  • В данном утверждении разумно предполагается использование шифрования MD5.
  • Завершает формирование одинарной цитируемой строки и закрывающей скобки.
  • Добавляет к утверждению условие, которое всегда будет истинным.

В целом, успешная атака представляет собой сочетание нескольких методов, подобных показанным выше.

Другие типы атак с помощью SQL-инъекций

SQL-инъекции могут причинить больше вреда, чем просто обход алгоритмов авторизации. К числу таких атак относятся:

  • Удаление данных
  • Обновление данных
  • Вставка данных
  • Выполнение команд на сервере, которые могут загружать и устанавливать вредоносные программы, такие как трояны.
  • Экспорт ценных данных, таких как данные кредитных карт, адреса электронной почты и пароли, на удаленный сервер злоумышленника
  • Получение данных для входа пользователя и т.д.
  • SQL-инъекция на основе файлов cookie
  • SQL-инъекция на основе ошибок
  • Слепая SQL-инъекция

Приведённый выше список не является исчерпывающим; он лишь даёт представление о том, на что способны SQL-инъекции.

Инструменты автоматизации для SQL-инъекций

В приведенном выше примере мы использовали методы ручной атаки, основанные на наших обширных знаниях SQL. Существуют автоматизированные инструменты, которые могут помочь вам выполнить атаки более эффективно и в кратчайшие сроки. К таким инструментам относятся:

Как предотвратить SQL-инъекции

Организация может принять следующую политику для защиты от атак с использованием SQL-инъекций.

  • Вводимой пользователем информации никогда нельзя доверять. – Перед использованием в динамических SQL-запросах его необходимо обязательно проверить на наличие ошибок (провести санитарную обработку).
  • Хранимые процедуры – они могут инкапсулировать SQL-запросы и обрабатывать все входные данные как параметры.
  • Подготовленные заявления – Подготовленные запросы работают следующим образом: сначала создается SQL-запрос, а затем все предоставленные пользователем данные обрабатываются как параметры. Это не влияет на синтаксис SQL-запроса.
  • Обычные выражения – их можно использовать для обнаружения потенциально вредоносного кода и его удаления перед выполнением SQL-запросов.
  • Права доступа пользователя к подключению к базе данных – к используемым учетным записям следует предоставлять только необходимые права доступа. подключиться к базе данных. Это может помочь уменьшить возможности выполнения операторов SQL на сервере.
  • Сообщения об ошибках – Эти сообщения не должны раскрывать конфиденциальную информацию или точное место возникновения ошибки. Вместо отображения SQL-запросов, вызвавших ошибку, можно использовать простые пользовательские сообщения об ошибках, например: «Извините, у нас возникли технические неполадки. Мы связались с технической поддержкой. Пожалуйста, попробуйте позже».

Хакерская активность: использование Havij для SQL-инъекций

В этом практическом примере мы используем программу Havij Advanced SQL Injection для сканирования веб-сайта на наличие уязвимостей.

Примечание: Havij — устаревшая и не поддерживаемая система. Windows Инструмент — SQLMap, указанный выше, является текущим стандартом с открытым исходным кодом.

Примечание: ваша антивирусная программа может пометить его как вредоносное из-за его особенностей. Вам следует добавить его в список исключений или приостановить его установку. антивирусная программа.

На изображении ниже показано главное окно Havij.

Главное окно инструмента Havij для SQL-инъекций

Вышеуказанный инструмент можно использовать для оценки уязвимости веб-сайта или приложения.

Часто задаваемые вопросы (FAQ)

Тестирование приложений, которые вам не принадлежат, запрещено законом, например, Законом США о компьютерном мошенничестве и злоупотреблениях. В рамках программ вознаграждения за обнаружение ошибок определяются допустимые действия.

Да. В списке OWASP Top 10:2025 инъекции занимают 5-е место (A05), и тестирование по-прежнему выявляет их практически в каждом приложении. С тысячами новых CVE-уязвимостей для SQL-инъекций в год, это остается одной из ведущих угроз в веб-среде.

MD5 — это быстрый хеш, а не алгоритм шифрования, и злоумышленники быстро взламывают его с помощью радужных таблиц и графических процессоров. Вместо этого используйте медленный алгоритм с солью, такой как bcrypt или Argon2, для паролей.

Любая база данных, к которой осуществляется запрос с помощью динамически формируемых SQL-запросов — MySQL, PostgreSQL, Microsoft SQL Server, Oracle и SQLiteНедостаток заключается в том, как приложение объединяет пользовательский ввод в запросы, а не в механизме базы данных.

Межсетевые экраны и сканеры на базе искусственного интеллекта изучают нормальные схемы трафика, а затем в режиме реального времени выявляют аномальные входные данные, такие как внедренные условия или комментарии. Модели машинного обучения обнаруживают обфусцированные полезные нагрузки, которые пропускают фиксированные сигнатуры.

ИИ-помощники, такие как Второй пилот GitHub Они могут предлагать параметризованные запросы и проверку входных данных, но также воспроизводят небезопасные шаблоны. Рассматривайте каждое предложение как черновик и используйте для его проверки инструмент проверки безопасности.

SQL-инъекции нацелены на базу данных путем внедрения SQL-кода в серверные запросы. Межсайтовый скриптинг нацелен на других пользователей путем внедрения скриптов, которые выполняются в их браузерах. Один из них раскрывает данные; другой перехватывает сессии.

ORM (объектно-реляционный маппер) по умолчанию формирует запросы из объектов кода с параметризацией, предотвращая большинство SQL-инъекций. Однако он не является абсолютно надежным — необработанные запросы и небезопасные методы все еще могут приводить к утечкам, поэтому валидация по-прежнему важна.

Подведем итог этой публикации следующим образом: