Что это за строка?
Строка ' 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. Понимание механизма таких атак помогает разработчикам и администраторам правильно выстраивать защиту. Если вы обнаружили подобные строки в логах, это сигнал о попытке взлома и необходимости проверить безопасность вашего веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий