Что такое AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- -?

Строка ) AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных через сообщения об ошибках, которые возвращает сервер.

В данной статье мы подробно разберём, как работает этот запрос, какие функции MySQL задействованы, и главное — как защитить своё веб-приложение от подобных атак.

Разбор составляющих запроса

Давайте разложим строку на компоненты, чтобы понять её назначение.

1. AND

Логический оператор AND используется для добавления условия к существующему SQL-запросу. Злоумышленник предполагает, что исходный запрос имеет конструкцию вида SELECT ... WHERE id = '$input'. Подставляя AND ..., он пытается выполнить дополнительное выражение, результат которого повлияет на ответ сервера.

2. EXTRACTVALUE(8393, CONCAT(...))

Функция EXTRACTVALUE в MySQL предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_document, XPath_expression). Однако при неправильном XPath-выражении функция генерирует ошибку, которая содержит переданный фрагмент. Этим и пользуются атакующие.

В нашем случае первым аргументом идёт число 8393 — это просто произвольное число, которое не является корректным XML-документом. Второй аргумент — результат CONCAT.

3. CONCAT(0x7e, ((SELECT (ELT(8393=8393,1)))), 0x7e)

Функция CONCAT объединяет строки. Здесь:

  • 0x7e — шестнадцатеричное представление символа ~ (тильда). Он используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.
  • ((SELECT (ELT(8393=8393,1)))) — подзапрос, который возвращает результат функции ELT.
  • Второй 0x7e — закрывающая тильда.

4. ELT(8393=8393,1)

Функция ELT возвращает N-й элемент из списка строк: ELT(N, str1, str2, ...). Если N=1, возвращается первая строка. Здесь 8393=8393 — это логическое выражение, которое всегда истинно (1). Таким образом, ELT(1,1) вернёт строку '1'. Это простейший пример; в реальных атаках вместо 1 может быть подзапрос, извлекающий данные (например, версию СУБД, имена таблиц и т.д.).

5. -- -

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

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

Предположим, что на сайте есть страница с параметром id, и уязвимый запрос выглядит так:

SELECT * FROM articles WHERE id = '$id'

Злоумышленник передаёт в параметр id значение:

1' AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- -

После подстановки запрос принимает вид:

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

MySQL выполняет EXTRACTVALUE с некорректным XPath, и возвращает ошибку примерно такого содержания:

XPATH syntax error: '~1~'

В сообщении об ошибке отображается результат подзапроса, обёрнутый в тильды. Если вместо 1 использовать, например, (SELECT version()), то в ошибке появится версия MySQL. Так пошагово атакующий может извлечь любые данные: имена таблиц, столбцов, логины и пароли пользователей.

Почему это опасно?

Error-based SQL-инъекции позволяют злоумышленнику:

  • Получить полный доступ к базе данных, включая конфиденциальную информацию.
  • Обойти аутентификацию и авторизацию.
  • Изменить или удалить данные.
  • В некоторых случаях — выполнить произвольные команды на сервере.

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

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

Основной метод защиты — использование параметризованных запросов (prepared statements) с привязкой параметров. Это исключает возможность внедрения SQL-кода, так как данные передаются отдельно от самого запроса.

Дополнительные меры:

  • Экранирование специальных символов с помощью функций вроде mysqli_real_escape_string (но это менее надёжно, чем prepared statements).
  • Валидация и фильтрация входных данных — проверяйте, что параметры соответствуют ожидаемому типу (число, строка и т.д.).
  • Ограничение прав пользователя БД — не используйте учётную запись с правами администратора для работы приложения.
  • Отключение вывода подробных ошибок на продакшене — это затруднит эксплуатацию error-based инъекций.
  • Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
  • Регулярное обновление СУБД и фреймворков — чтобы закрыть известные уязвимости.

Заключение

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

Источники