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

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

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

Разбор по частям

1. Закрывающие скобки и кавычка: '))

Внедрение начинается с двух закрывающих круглых скобок и одинарной кавычки. Это нужно, чтобы «разорвать» исходный SQL-запрос и вставить собственный код. Например, если уязвимый параметр вставляется в условие WHERE id = ('$input'), то последовательность ')) закроет строку и скобки, позволив добавить логическое выражение AND ....

2. Оператор AND

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

3. Функция EXTRACTVALUE

Синтаксис: EXTRACTVALUE(XML_frag, XPath_expr). Она извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно (например, содержит недопустимые символы), MySQL возвращает ошибку вида XPATH syntax error: '...', в которую подставляется часть выражения. Это и есть канал утечки данных.

4. Аргументы: 3294 и CONCAT(0x7e, ((SELECT (ELT(3294=3294,1)))),0x7e)

Первый аргумент — 3294 — это произвольное число, которое не является корректным XML. Второй аргумент — сложное выражение, которое формирует строку, передаваемую в XPath. Рассмотрим его:

  • 0x7e — шестнадцатеричное представление символа ~ (тильда). Используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.
  • (SELECT (ELT(3294=3294,1))) — подзапрос, возвращающий результат функции ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 3294=3294 — истинное условие, возвращающее 1, поэтому ELT(1, 1) вернёт строку '1'. В реальной атаке вместо ELT(3294=3294,1) мог бы быть подзапрос, извлекающий данные (например, SELECT password FROM users LIMIT 1).
  • Далее снова 0x7e — закрывающая тильда.

Таким образом, CONCAT склеивает тильду, результат подзапроса и ещё одну тильду, формируя строку вида ~1~. Эта строка передаётся в EXTRACTVALUE в качестве XPath-выражения. Поскольку она не является допустимым XPath (начинается с тильды), MySQL генерирует ошибку, включающую эту строку. В результате в ответе приложения (если ошибки не подавляются) злоумышленник увидит что-то вроде: XPATH syntax error: '~1~'.

5. Комментарий -- -

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

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

Error-based инъекция — один из самых быстрых способов извлечения данных, поскольку не требует множества запросов (как в слепой инъекции). Если приложение отображает сообщения об ошибках БД, атакующий может подставлять в подзапрос различные SQL-выражения и получать их результаты в тексте ошибки. Например, заменив ELT(3294=3294,1) на (SELECT version()), он получит версию MySQL; на (SELECT database()) — имя текущей базы данных; на (SELECT password FROM users LIMIT 1) — пароль пользователя и т.д.

Важно отметить, что в современных СУБД и фреймворках такие функции, как EXTRACTVALUE, могут быть отключены или ограничены, а ошибки — подавляться. Однако на устаревших или неправильно настроенных системах этот вектор остаётся актуальным.

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

Основной метод защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Они гарантируют, что пользовательский ввод не будет интерпретирован как SQL-код. Дополнительные меры:

  • Экранирование специальных символов (менее надёжно, чем параметризация).
  • Валидация и фильтрация входных данных (например, приведение к ожидаемому типу).
  • Отключение вывода подробных сообщений об ошибках БД в production-окружении.
  • Использование ORM и современных фреймворков, которые по умолчанию применяют параметризацию.
  • Регулярное обновление СУБД и применение принципа наименьших привилегий для учётной записи, под которой работает приложение.

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

Заключение

Рассмотренная полезная нагрузка — типичный пример эксплуатации error-based SQL-инъекции через функцию EXTRACTVALUE. Понимание механики таких атак помогает разработчикам и администраторам лучше защищать свои системы. Помните: безопасность — это процесс, а не разовое действие.

Источники