Введение

В сфере информационной безопасности часто встречаются строки, которые на первый взгляд кажутся бессмысленным набором символов. Одной из таких является последовательность ')))) AND EXTRACTVALUE(3483,CONCAT(0x7e,((SELECT (ELT(3483=3483,1)))),0x7e))-- -. Этот запрос представляет собой классический пример error-based SQL-инъекции для СУБД MySQL. В данной статье мы подробно разберём, что означает каждый элемент этой строки, как она работает и, главное, как от неё защититься.

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

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

Error-based SQL-инъекция — это разновидность, при которой злоумышленник извлекает информацию через сообщения об ошибках, возвращаемые базой данных. Если приложение выводит эти ошибки на страницу, атакующий может получить ценные сведения, такие как версия СУБД, имена таблиц, логины и пароли пользователей.

Разбор строки инъекции

Рассмотрим детально каждый компонент запроса ')))) AND EXTRACTVALUE(3483,CONCAT(0x7e,((SELECT (ELT(3483=3483,1)))),0x7e))-- -.

1. Закрывающие кавычки и скобки: '))))

В начале строки идут символы ')))). Они предназначены для завершения предыдущего SQL-выражения, которое было открыто в уязвимом запросе. Например, если исходный запрос выглядел как SELECT * FROM users WHERE id = '$input', то подставив ')))), атакующий закрывает кавычку и скобки, делая возможным добавление собственного кода.

2. Логический оператор AND

После закрывающих символов следует AND — логический оператор, который позволяет присоединить дополнительное условие к исходному запросу. Это необходимо, чтобы внедрённая часть выполнилась только при определённых условиях, но в error-based инъекциях часто используется просто для соединения.

3. Функция EXTRACTVALUE

EXTRACTVALUE(XML_fragment, XPath_expression) — это встроенная функция MySQL, предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Однако она также известна как инструмент для проведения error-based SQL-инъекций. Если передать в неё некорректный XPath, функция генерирует ошибку, в тексте которой может содержаться переданная строка.

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

4. CONCAT и шестнадцатеричные литералы

CONCAT(0x7e, ..., 0x7e) — функция конкатенации строк. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как разделитель, чтобы облегчить поиск выводимых данных в сообщении об ошибке. Атакующий оборачивает полезную нагрузку в тильды, чтобы потом легко извлечь её из текста ошибки.

5. Подзапрос с ELT

Внутри CONCAT находится подзапрос (SELECT (ELT(3483=3483,1))). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае условие 3483=3483 всегда истинно, поэтому ELT возвращает 1. Это простейший пример; в реальной атаке вместо 1 мог бы быть, например, SELECT password FROM users LIMIT 1. Таким образом, строка 1 будет вставлена в XPath-выражение, что вызовет ошибку с текстом, содержащим эту строку.

6. Комментарий -- -

В конце строки стоит -- -. Двойной дефис -- в MySQL начинает комментарий, а пробел после него (или другой символ) необходим, чтобы комментарий корректно распознался. Всё, что идёт после --, игнорируется базой данных. Это позволяет атакующему «отрезать» оставшуюся часть оригинального запроса, чтобы не нарушать синтаксис.

Как работает атака

Предположим, уязвимый параметр передаётся в запрос:

SELECT * FROM articles WHERE id = '$_GET[id]'

Если злоумышленник подставит нашу строку, итоговый запрос примет вид:

SELECT * FROM articles WHERE id = '')))) AND EXTRACTVALUE(3483,CONCAT(0x7e,((SELECT (ELT(3483=3483,1)))),0x7e))-- -'

После закрытия кавычек и скобок, добавления AND и вызова EXTRACTVALUE, база данных попытается выполнить функцию EXTRACTVALUE с некорректным XPath. Это приведёт к ошибке, например:

XPATH syntax error: '~1~'

В сообщении об ошибке появится строка ~1~. Если вместо 1 подставить подзапрос, возвращающий конфиденциальные данные, они также отобразятся в ошибке. Так атакующий может посимвольно извлекать информацию из базы данных.

Последствия успешной инъекции

Успешная error-based SQL-инъекция может привести к:

  • Утечке конфиденциальных данных (пароли, персональные данные, номера кредитных карт).
  • Изменению или удалению информации в базе данных.
  • Полному захвату контроля над сервером базы данных.
  • Дальнейшему распространению атаки на другие системы.

Как защититься от error-based SQL-инъекций

Основные меры защиты:

  1. Использование подготовленных выражений (prepared statements). Это самый надёжный способ, при котором SQL-код и данные передаются раздельно, и база данных не интерпретирует ввод как часть запроса.
  2. Экранирование специальных символов. Если подготовленные выражения недоступны, необходимо тщательно экранировать все пользовательские данные, особенно кавычки и обратные слэши.
  3. Отключение вывода ошибок БД в production. Сообщения об ошибках не должны показываться пользователям; их следует записывать в лог, а посетителю выдавать общую страницу ошибки.
  4. Ограничение прав пользователя БД. Учётная запись, от имени которой работает приложение, должна иметь минимально необходимые привилегии.
  5. Регулярное обновление СУБД и фреймворков. Устаревшие версии могут содержать уязвимости.
  6. Использование WAF (Web Application Firewall). Специализированные межсетевые экраны могут блокировать попытки SQL-инъекций.

Заключение

Строка ')))) AND EXTRACTVALUE(3483,CONCAT(0x7e,((SELECT (ELT(3483=3483,1)))),0x7e))-- - — это яркий пример error-based SQL-инъекции, демонстрирующий, как злоумышленники используют встроенные функции MySQL для извлечения данных через сообщения об ошибках. Понимание механизмов таких атак помогает разработчикам и администраторам своевременно закрывать уязвимости и защищать свои веб-приложения.

Источники