Что это за строка?
Строка %")))) AND EXTRACTVALUE(6787,CONCAT(0x7e,((SELECT (ELT(6787=6787,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (SQL-инъекция, основанная на ошибках) для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в отчётах по пентесту (тестированию на проникновение) и в базах уязвимостей, например, в CVE.
В основе лежит функция EXTRACTVALUE(), которая извлекает значение из XML-документа с помощью XPath-выражения. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой может содержаться результат выполнения вложенного запроса. Это позволяет злоумышленнику получать данные из базы, даже если прямой вывод информации не отображается на странице.
Как работает эта инъекция?
Рассмотрим по частям:
- %")))) — это часть исходного запроса, которая, вероятно, закрывает кавычки и скобки, чтобы внедрить свой код. Символ
%может быть частью URL-кодирования или шаблона LIKE. - AND EXTRACTVALUE(6787,CONCAT(0x7e,((SELECT (ELT(6787=6787,1)))),0x7e)) — это внедряемая полезная нагрузка. Она вызывает функцию
EXTRACTVALUEс двумя аргументами: первый — произвольное число 6787, второй — конкатенация тильды (0x7e— шестнадцатеричный код символа ~), затем результат подзапроса(SELECT (ELT(6787=6787,1)))и снова тильда. - -- - — это комментарий, который отсекает оставшуюся часть оригинального SQL-запроса, чтобы не вызвать синтаксическую ошибку.
Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(6787=6787,1) — условие 6787=6787 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. Это простейший пример, который можно заменить на любой другой подзапрос, например, для извлечения имени пользователя или хеша пароля.
Функция CONCAT объединяет тильду, результат подзапроса и ещё одну тильду. Полученная строка передаётся в EXTRACTVALUE как XPath-выражение. Поскольку она не является валидным XPath, MySQL выдаёт ошибку вида: XPATH syntax error: '~1~'. В этом сообщении и содержится искомая информация.
Зачем используют EXTRACTVALUE?
Error-based инъекции через EXTRACTVALUE (а также UPDATEXML) популярны, потому что они позволяют получить данные напрямую в ответе сервера, без необходимости слепого подбора (boolean-based или time-based). Это быстрее и надёжнее. Однако такие инъекции работают только если приложение выводит сообщения об ошибках СУБД пользователю. В современных фреймворках и CMS ошибки обычно скрываются, что делает этот метод менее эффективным.
Тем не менее, в устаревших системах или при невнимательной настройке сервера подобные атаки могут быть успешными. Поэтому важно понимать механизм их работы для построения защиты.
Пример эксплуатации
Предположим, есть уязвимый параметр id в URL: http://example.com/product.php?id=1. Злоумышленник может подставить вместо 1 такую строку:
1 AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -
Если приложение уязвимо, в ответе появится ошибка с версией MySQL. Аналогично можно извлечь имена таблиц, колонок и сами данные.
Как защититься от error-based SQL-инъекций?
Основные меры защиты:
- Использование подготовленных выражений (prepared statements) с параметризацией запросов. Это самый надёжный способ, так как данные не попадают в тело SQL-запроса.
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string(для MySQL). Но этот метод уступает подготовленным выражениям. - Отключение вывода ошибок СУБД на продакшене. Ошибки должны логироваться, а не показываться пользователю.
- Использование ORM (например, Doctrine, Hibernate), которые по умолчанию используют параметризацию.
- Регулярное обновление CMS, фреймворков и библиотек для устранения известных уязвимостей.
- WAF (Web Application Firewall) может блокировать подозрительные запросы, но не является панацеей.
Важно понимать, что EXTRACTVALUE — не единственная функция для error-based инъекций. Также используются UPDATEXML, GTID_SUBSET, JSON_KEYS и другие. Однако принцип остаётся схожим: вызвать ошибку, содержащую полезные данные.
Заключение
Строка %")))) AND EXTRACTVALUE(6787,CONCAT(0x7e,((SELECT (ELT(6787=6787,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Она демонстрирует, как злоумышленники могут использовать особенности функций MySQL для извлечения информации. Понимание таких атак помогает разработчикам и специалистам по безопасности создавать более защищённые приложения. Никогда не пренебрегайте проверкой входных данных и используйте современные методы защиты.
Комментарии
—Войдите, чтобы оставить комментарий