Что это за строка?
Строка %") AND EXTRACTVALUE(6724,CONCAT(0x7e,((SELECT (ELT(6724=6724,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в отчётах пентестеров и в логах веб-серверов при попытках взлома.
Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Давайте разберём её по частям.
Анатомия инъекции
Разберём строку по компонентам:
%")— начало полезной нагрузки. Символ%часто используется для обхода фильтров, а")закрывает ранее открытые кавычку и скобку в уязвимом SQL-запросе. Это позволяет «вырваться» из контекста и добавить собственный код.AND— логический оператор, присоединяющий наше условие к исходному запросу.EXTRACTVALUE(6724, CONCAT(...))— функция MySQL для работы с XML. Она принимает XML-документ и XPath-выражение. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой отображается переданное значение. Это и есть основа error-based инъекции.CONCAT(0x7e, ((SELECT (ELT(6724=6724,1)))), 0x7e)— конкатенация символа~(0x7e), результата подзапроса и ещё одного~. Символы~служат маркерами, чтобы в сообщении об ошибке легко было найти извлечённые данные.ELT(6724=6724,1)— функция ELT возвращает N-й элемент из списка. Здесь условие6724=6724всегда истинно (1), поэтому возвращается первый элемент — число 1. В реальной атаке вместо этого условия подставляется запрос к базе, например,ELT(1=1, (SELECT password FROM users LIMIT 1)).-- -— комментарий, который «съедает» остаток исходного запроса, чтобы синтаксис остался корректным.
Как работает error-based SQL-инъекция
Механизм основан на том, что СУБД при ошибке выводит отладочную информацию, если включён режим подробных сообщений. Злоумышленник конструирует запрос так, чтобы в тексте ошибки оказались данные из базы.
Например, если в уязвимом параметре передать:
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))-- -
MySQL вернёт ошибку вида:
XPATH syntax error: '~5.7.33~'
Так злоумышленник узнаёт версию СУБД. Аналогично можно извлечь имена таблиц, столбцов, логины, пароли и любые другие данные.
Почему EXTRACTVALUE?
Функция EXTRACTVALUE (а также UPDATEXML) часто используется в error-based инъекциях, потому что она принимает XPath-выражение. Если передать в качестве XPath строку, начинающуюся с недопустимого символа (например, ~), MySQL сгенерирует ошибку и включит в неё эту строку. Это позволяет выводить произвольные данные.
Пошаговый разбор примера
Рассмотрим строку %") AND EXTRACTVALUE(6724,CONCAT(0x7e,((SELECT (ELT(6724=6724,1)))),0x7e))-- -.
- Закрытие контекста:
%")— предполагается, что исходный запрос выглядел какSELECT * FROM table WHERE id = '%"...'. Символы")закрывают строку и скобку, позволяя внедрить свой код. - Добавление условия:
AND EXTRACTVALUE(...)— присоединяем вызов функции к условию WHERE. - Формирование аргументов: первый аргумент
6724— произвольное число (XML-документ, который не анализируется). Второй аргумент —CONCAT(0x7e, ((SELECT (ELT(6724=6724,1)))), 0x7e). ЗдесьELT(6724=6724,1)возвращает 1, так как условие истинно. В реальной атаке вместо1был бы подзапрос, возвращающий нужные данные. - Генерация ошибки: XPath-выражение начинается с символа
~, что недопустимо. MySQL выдаёт ошибку:XPATH syntax error: '~1~'. - Комментирование остатка:
-- -отсекает оставшуюся часть оригинального запроса.
В данном конкретном примере извлекается просто число 1 — это тестовая строка, чтобы проверить наличие уязвимости. Если ошибка появилась, значит, инъекция возможна, и можно переходить к извлечению реальных данных.
Чем опасна такая инъекция?
Error-based SQL-инъекция — один из самых быстрых способов получить данные из базы. В отличие от blind-инъекций, где приходится задавать множество запросов и анализировать время отклика, здесь информация возвращается сразу в тексте ошибки. Это позволяет злоумышленнику:
- получить версию СУБД, имена баз, таблиц и столбцов;
- извлечь логины, пароли, хеши, персональные данные пользователей;
- при наличии прав — выполнить произвольные SQL-запросы, вплоть до удаления данных.
Особенно опасна комбинация с автоматизированными инструментами (sqlmap), которые могут эксплуатировать уязвимость без глубоких знаний SQL.
Как защититься
Основной способ защиты — использовать параметризованные запросы (prepared statements). В этом случае данные пользователя передаются отдельно от SQL-кода и не могут изменить структуру запроса.
Дополнительные меры:
- Валидация и фильтрация входных данных (белые списки).
- Отключение подробных сообщений об ошибках на продакшене (display_errors = off).
- Использование ORM и query builder'ов, которые экранируют опасные символы.
- Регулярное обновление СУБД и фреймворков.
- Применение WAF (Web Application Firewall) для блокировки подозрительных запросов.
Важно понимать: экранирование кавычек не всегда спасает, если запрос строится динамически. Надёжнее всего — параметризация.
Частые вопросы
Можно ли использовать EXTRACTVALUE в MySQL 8?
В MySQL 8.0 функция EXTRACTVALUE была удалена. Однако существуют аналоги, например, UPDATEXML (тоже удалена в 8.0) или другие функции, вызывающие ошибки. Error-based инъекции эволюционируют, но принцип остаётся.
Что означает 0x7e?
Это шестнадцатеричное представление символа ~ (тильда). Он используется как маркер, чтобы легко найти начало и конец извлечённых данных в сообщении об ошибке.
Почему в примере 6724=6724?
Это условие-заглушка, которое всегда истинно. В реальной атаке вместо него подставляется полезный подзапрос.
Заключение
Строка %") AND EXTRACTVALUE(6724,CONCAT(0x7e,((SELECT (ELT(6724=6724,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Она демонстрирует, как через функцию EXTRACTVALUE и конкатенацию можно заставить MySQL вывести данные в сообщении об ошибке. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий