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

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

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

Контекст: почему в начале идут скобки и AND

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

Далее следует AND — логический оператор, который позволяет присоединить произвольное условие к исходному запросу. Если исходный запрос был, например, SELECT * FROM users WHERE id = '$input', то после подстановки получается нечто вроде ... WHERE id = '')))) AND EXTRACTVALUE(...)-- -'. Два дефиса с пробелом в конце (-- -) — это комментарий в MySQL, который «съедает» остаток оригинального запроса, чтобы он не вызвал синтаксическую ошибку.

Функция EXTRACTVALUE: назначение и синтаксис

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

В нашем случае первым аргументом идёт число 6824 — это не XML, а просто произвольное число. Второй аргумент — результат CONCAT(0x7e, ((SELECT (ELT(6824=6824,1)))), 0x7e). Функция EXTRACTVALUE пытается интерпретировать первый аргумент как XML, терпит неудачу и возвращает ошибку вида XPATH syntax error: '~1~'. В этой ошибке и «утекают» данные, которые злоумышленник подставил в CONCAT.

CONCAT и ELT: формирование полезной нагрузки

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

Внутри CONCAT находится подзапрос SELECT (ELT(6824=6824,1)). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Выражение 6824=6824 всегда истинно, то есть равно 1. Значит, ELT(1, 1) вернёт строку '1'. Это простейший тест: если инъекция сработает, в ошибке появится ~1~.

В реальной атаке вместо ELT(6824=6824,1) подставляют подзапросы, извлекающие имена таблиц, столбцов или конкретные данные, например: SELECT (ELT(1, (SELECT table_name FROM information_schema.tables LIMIT 1))). Тогда в тексте ошибки отобразится имя первой таблицы.

Пошаговый разбор строки

  1. )))) — закрывающие скобки для нарушения синтаксиса исходного запроса.
  2. AND — логическое «И», присоединяющее условие.
  3. EXTRACTVALUE(6824, ...) — функция, вызывающая ошибку с подконтрольным текстом.
  4. CONCAT(0x7e, ..., 0x7e) — обёртка с тильдами для маркировки данных.
  5. SELECT (ELT(6824=6824,1)) — подзапрос, возвращающий строку '1' (в учебном примере).
  6. -- - — комментарий, отсекающий остаток запроса.

Зачем это нужно злоумышленнику

Error-based SQL-инъекция позволяет быстро получать данные, не прибегая к слепым методам. Ошибка с текстом XPATH syntax error: '~имя_таблицы~' сразу показывает искомое значение. Это один из самых удобных способов эксплуатации, если приложение выводит сообщения об ошибках СУБД на страницу.

Важно: начиная с MySQL 8.0.17 функции EXTRACTVALUE и UPDATEXML объявлены устаревшими и удалены. Однако многие веб-приложения до сих пор работают на старых версиях, поэтому угроза сохраняется.

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

  • Параметризованные запросы (prepared statements) — главный способ предотвращения SQL-инъекций. Данные передаются отдельно от кода SQL.
  • Экранирование специальных символов — если параметризация невозможна, используйте функции экранирования, предоставляемые драйвером БД.
  • Отключение вывода ошибок СУБД — не показывайте пользователям детальные сообщения об ошибках базы данных.
  • Регулярные обновления — переход на MySQL 8.0.17+ устраняет саму возможность использования EXTRACTVALUE.
  • WAF и мониторинг — веб-приложения-экраны могут блокировать подозрительные последовательности, но не заменяют исправление кода.

Распространённость и последствия

SQL-инъекции остаются в списке OWASP Top 10 на протяжении многих лет. По данным отчётов по безопасности, они входят в тройку самых критичных уязвимостей веб-приложений. Успешная эксплуатация может привести к утечке всей базы данных, включая пароли, персональные данные и платёжную информацию. Для бизнеса это оборачивается финансовыми потерями, штрафами и репутационным ущербом.

Строка, которую мы разобрали, — лишь один из множества шаблонов, используемых автоматическими сканерами (sqlmap, Burp Suite и др.). Понимание принципов работы таких payload'ов помогает разработчикам и специалистам по безопасности своевременно закрывать уязвимости.

Итог

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

Источники