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

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

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

Разбор синтаксиса

Начало: %'))))

Символы %' и несколько закрывающих скобок )))) предназначены для «обрыва» оригинального SQL-запроса. В реальном приложении строка может подставляться в запрос вида SELECT ... WHERE id = '...'. Злоумышленник добавляет кавычку и скобки, чтобы закрыть строковый литерал и все открытые скобки, сделав дальнейший код синтаксически корректным. Символ % в начале может быть частью LIKE-шаблона или просто мусором для обхода фильтров.

Оператор AND

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

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

EXTRACTVALUE — встроенная функция MySQL (и MariaDB), предназначенная для извлечения значения из XML-фрагмента. Она принимает два аргумента: XML-документ и XPath-выражение. Если XPath синтаксически неверен, функция генерирует ошибку, в тексте которой может содержаться переданное значение. Это и используется для error-based инъекций.

Первый аргумент 3818 — произвольное число, которое не является корректным XML. Однако это не важно: главное — второй аргумент, содержащий XPath-выражение, которое заведомо вызовет ошибку.

Второй аргумент: CONCAT(0x7e, ((SELECT (ELT(3818=3818,1)))), 0x7e)

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

Внутри CONCAT находится подзапрос (SELECT (ELT(3818=3818,1))). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае 3818=3818 — это логическое выражение, которое всегда истинно (1). Таким образом, ELT(1, 1) возвращает строку '1'. Подзапрос SELECT '1' просто возвращает единицу. Это тестовая конструкция: в реальной атаке вместо ELT(3818=3818,1) мог бы быть подзапрос, извлекающий имя пользователя или хеш пароля, например SELECT password FROM users LIMIT 1. Но здесь для демонстрации используется безобидное выражение.

Итоговый XPath, передаваемый в EXTRACTVALUE, выглядит так: ~1~. С точки зрения синтаксиса XPath это недопустимая строка (начинается с тильды), поэтому EXTRACTVALUE выдаст ошибку вида: XPATH syntax error: '~1~'. Если бы вместо 1 был результат подзапроса, он бы отобразился в тексте ошибки.

Завершение: -- -

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

Цель и контекст применения

Подобные полезные нагрузки применяются на этапе эксплуатации SQL-инъекции, когда другие методы (UNION, blind) недоступны или неудобны. Error-based инъекция позволяет быстро получить данные, если приложение выводит сообщения об ошибках базы данных. Однако в современных веб-приложениях такие ошибки обычно скрыты, поэтому метод менее популярен, чем UNION или blind-инъекции.

Строка с EXTRACTVALUE часто встречается в автоматических сканерах уязвимостей (например, sqlmap) как одна из тестовых нагрузок. Также она есть в многочисленных «шпаргалках» по SQL-инъекциям, где приводится в качестве шаблона для замены подзапроса на нужный.

Опасность и защита

Хотя конкретно эта нагрузка не наносит вреда (она лишь вызывает ошибку с числом 1), она демонстрирует уязвимость. Если злоумышленник может внедрить произвольный SQL-код, он может извлечь конфиденциальные данные, изменить или удалить информацию. Для защиты необходимо использовать параметризованные запросы (prepared statements), хранимые процедуры и тщательно проверять все входные данные. Никогда не подставляйте пользовательский ввод напрямую в SQL-запросы.

Важно: статья носит образовательный характер. Использование описанных техник без разрешения владельца системы является незаконным.

Итог

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

Источники