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

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

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

Детальный разбор конструкции

Рассмотрим каждый элемент запроса:

  • ' — одинарная кавычка, закрывающая строковый литерал в уязвимом запросе.
  • OR — логический оператор, позволяющий обойти условие.
  • EXTRACTVALUE(1679, CONCAT(0x7e, ((SELECT (ELT(1679=1679,1)))), 0x7e)) — вызов функции, которая при ошибке выведет свой второй аргумент.
  • -- - — комментарий, обрезающий оставшуюся часть исходного запроса.

Внутри EXTRACTVALUE используется CONCAT для объединения тильды (0x7e в шестнадцатеричном виде) с результатом подзапроса. Подзапрос SELECT (ELT(1679=1679,1)) возвращает строку '1', если условие истинно (1679=1679 всегда истинно). Функция ELT() возвращает N-й элемент из списка; в данном случае возвращается '1'.

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

Как работает error-based SQL-инъекция

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

Функция EXTRACTVALUE() в MySQL предназначена для работы с XML. Синтаксис: EXTRACTVALUE(XML_frag, XPath_expr). Если XPath-выражение некорректно, MySQL возвращает ошибку с указанием проблемного фрагмента. Используя CONCAT с запрещёнными символами (например, '~'), атакующий добивается, чтобы в тексте ошибки появилась полезная нагрузка.

Аналогичный механизм используется с функциями UPDATEXML() и GEOMETRYCOLLECTION(). Все они позволяют внедрять подзапросы в сообщения об ошибках.

Пример эксплуатации

Предположим, уязвимый запрос выглядит так:

SELECT * FROM articles WHERE id = '$_GET[id]'

Передав в параметр id строку ' OR EXTRACTVALUE(1679,CONCAT(0x7e,((SELECT (ELT(1679=1679,1)))),0x7e))-- -, злоумышленник получит ошибку:

XPATH syntax error: '~1~'

Чтобы извлечь, например, версию базы данных, можно заменить подзапрос на (SELECT VERSION()). Тогда в ошибке отобразится версия MySQL. Далее можно извлекать имена таблиц из information_schema.tables и содержимое других таблиц.

Последствия и защита

Успешная SQL-инъекция может привести к утечке конфиденциальных данных, изменению или удалению информации, обходу аутентификации и даже выполнению произвольных команд на сервере. Для предотвращения таких атак необходимо:

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

Важно регулярно обновлять СУБД и веб-приложения, а также проводить аудит кода на предмет уязвимостей.

Заключение

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

Источники