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

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

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

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

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

Закрывающие скобки ))

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

Оператор AND

Логический оператор AND позволяет присоединить дополнительное условие к исходному запросу. В error-based инъекциях он часто используется для того, чтобы внедряемая функция выполнилась только при истинности основного запроса, но это не обязательно — главное, чтобы СУБД обработала вызов функции.

Функция EXTRACTVALUE(4165, CONCAT(...))

EXTRACTVALUE — это встроенная функция MySQL (до версии 8.0.17), предназначенная для извлечения значения из XML-документа по XPath-выражению. Синтаксис: EXTRACTVALUE(xml_fragment, xpath_expression).

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

Первый аргумент 4165 — произвольное число, которое в данном случае не играет роли, так как XML-фрагмент не является корректным XML. Главное — вызвать ошибку с полезной нагрузкой во втором аргументе.

Функция CONCAT(0x7e, ..., 0x7e)

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

Подзапрос (SELECT (ELT(4165=4165,1)))

Внутри CONCAT находится подзапрос, который возвращает результат функции ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь ELT(4165=4165, 1) — условие 4165=4165 всегда истинно, что в числовом контексте даёт 1. Таким образом, ELT(1, 1) вернёт строку '1'.

Это упрощённый пример: в реальной атаке вместо 1 мог бы стоять подзапрос, извлекающий, например, имя пользователя или хеш пароля из системных таблиц.

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

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

Как это работает на практике

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

SELECT * FROM articles WHERE id = (('$id'))

Если злоумышленник передаст в параметр id строку )) AND EXTRACTVALUE(4165,CONCAT(0x7e,((SELECT (ELT(4165=4165,1)))),0x7e))-- -, то итоговый запрос станет таким:

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

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

XPATH syntax error: '~1~'

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

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

Error-based SQL-инъекции позволяют злоумышленнику получать данные из базы напрямую, без необходимости использовать «слепые» методы (blind SQLi), которые требуют множества запросов. Это значительно ускоряет атаку и упрощает её автоматизацию.

Основные риски:

  • Утечка конфиденциальной информации — пароли, персональные данные, платёжные реквизиты.
  • Компрометация всей базы данных — через системные таблицы (например, information_schema) можно получить структуру БД и затем извлечь любые данные.
  • Возможность дальнейшей эскалации — в некоторых конфигурациях через SQL-инъекцию можно выполнить произвольный код на сервере.

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

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

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

  • Валидация и фильтрация всех входных данных.
  • Применение ORM-библиотек, которые по умолчанию используют параметризацию.
  • Ограничение прав учётной записи БД (принцип наименьших привилегий).
  • Отключение отображения подробных ошибок СУБД в production-окружении.
  • Регулярное обновление MySQL и использование версий, где уязвимые функции удалены (в MySQL 8.0.17+ EXTRACTVALUE и UPDATEXML помечены как deprecated, а в 8.0.27 удалены).

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

Заключение

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

Источники