Что это за строка?
Строка )) 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 можно заставить СУБД вывести произвольные данные в сообщении об ошибке. Понимание таких примеров помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий