Что такое SQL-инъекция через EXTRACTVALUE?

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

Запрос, который мы разбираем: ) OR EXTRACTVALUE(6069,CONCAT(0x7e,((SELECT (ELT(6069=6069,1)))),0x7e))-- -. Он представляет собой классический пример error-based инъекции, где с помощью функции EXTRACTVALUE извлекается результат подзапроса.

Как работает EXTRACTVALUE

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

Например, если передать в EXTRACTVALUE строку, начинающуюся с тильды (~), MySQL вернёт ошибку вида: XPATH syntax error: '~результат~'. Это позволяет извлечь данные.

Разбор конкретного запроса

Рассмотрим выражение по частям:

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

Внутренний подзапрос SELECT (ELT(6069=6069,1)) всегда возвращает 1, так как условие 6069=6069 истинно, а функция ELT с истинным первым аргументом возвращает первый элемент из списка (в данном случае 1). Это простейший пример, демонстрирующий технику. На практике вместо ELT(6069=6069,1) подставляются подзапросы, извлекающие имена таблиц, колонок или данные пользователей.

Цель инъекции

Основная цель — заставить базу данных вернуть в сообщении об ошибке конфиденциальную информацию. Например, можно извлечь версию MySQL, имя текущей базы данных, имена таблиц и колонок, а затем и сами данные (логины, пароли, персональные сведения). В примере с ELT(6069=6069,1) атакующий просто проверяет работоспособность метода, так как результат предсказуем.

Последствия успешной атаки

Если приложение уязвимо, злоумышленник может:

  • Получить доступ к структуре базы данных.
  • Извлечь учётные данные пользователей.
  • Изменить или удалить данные.
  • В некоторых случаях выполнить команды на сервере.

Это приводит к утечке конфиденциальной информации, финансовым потерям и подрыву репутации компании.

Как защититься от error-based SQL-инъекций

Основной метод защиты — использование параметризованных запросов (prepared statements). Это предотвращает внедрение SQL-кода, так как данные передаются отдельно от структуры запроса. Также рекомендуется:

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

Важно понимать, что EXTRACTVALUE — не единственная функция, используемая для error-based инъекций. Аналогично применяются UPDATEXML, GTID_SUBSET, JSON_KEYS и другие. Поэтому защита должна быть комплексной.

Заключение

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

Источники