Что это за строка?

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

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

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

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

Однако при передаче некорректного XPath-выражения MySQL генерирует ошибку, текст которой содержит переданное выражение. Это и используется в атаках: злоумышленник формирует XPath так, чтобы в сообщении об ошибке оказались данные из базы.

Разбор запроса по частям

Рассмотрим каждый элемент подробнее:

  • )) — закрывающие скобки, необходимые для синтаксической подгонки под оригинальный запрос (например, если исходный запрос содержал вложенные условия).
  • AND — логический оператор, добавляющий условие к WHERE-части.
  • EXTRACTVALUE(1951, CONCAT(...)) — вызов функции с двумя аргументами: первый — произвольное число (1951), второй — конкатенация строк.
  • CONCAT(0x7e, ((SELECT (ELT(1951=1951,1)))), 0x7e) — объединение символа тильды (0x7e — шестнадцатеричный код ~) с результатом подзапроса и ещё одной тильдой.
  • SELECT (ELT(1951=1951,1)) — подзапрос, возвращающий 1, если условие 1951=1951 истинно. ELT — функция, возвращающая N-й элемент из списка; в данном случае список состоит из одного элемента — 1.
  • -- - — комментарий, игнорирующий остаток запроса.

Цель инъекции

Основная цель — заставить сервер вернуть сообщение об ошибке, содержащее результат выполнения подзапроса. В данном примере подзапрос возвращает просто число 1, что является тестовым шагом. В реальной атаке вместо 1 подставляются имена таблиц, колонок или конкретные данные, например: SELECT (ELT(1=1,CONCAT(username,0x3a,password))) FROM users LIMIT 1.

Символы тильды (~) используются как маркеры, чтобы облегчить поиск извлечённых данных в тексте ошибки. Часто они комбинируются с другими разделителями, например 0x3a (двоеточие).

Пример сообщения об ошибке

При выполнении такого запроса MySQL может вернуть ошибку вида:

XPATH syntax error: '~1~'

Если бы вместо 1 был, например, логин и пароль, ошибка выглядела бы так: XPATH syntax error: '~admin:secret~'. Это и есть утечка данных.

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

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

  • получать содержимое базы данных (учётные записи, персональные данные, платёжную информацию);
  • обходить аутентификацию;
  • изменять или удалять данные;
  • выполнять административные операции на сервере БД.

Особенно опасны такие атаки для сайтов, где ввод пользователя попадает в SQL-запрос без должной обработки.

Как защититься?

Основные меры противодействия:

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

Заключение

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

Источники