Что это за строка?
Строка )))) 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))). Тогда в тексте ошибки отобразится имя первой таблицы.
Пошаговый разбор строки
))))— закрывающие скобки для нарушения синтаксиса исходного запроса.AND— логическое «И», присоединяющее условие.EXTRACTVALUE(6824, ...)— функция, вызывающая ошибку с подконтрольным текстом.CONCAT(0x7e, ..., 0x7e)— обёртка с тильдами для маркировки данных.SELECT (ELT(6824=6824,1))— подзапрос, возвращающий строку '1' (в учебном примере).-- -— комментарий, отсекающий остаток запроса.
Зачем это нужно злоумышленнику
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 можно заставить базу данных выдать ошибку с контролируемым содержимым. Знание подобных техник необходимо для грамотной защиты веб-приложений.
Комментарии
—Войдите, чтобы оставить комментарий