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

Строка ') OR EXTRACTVALUE(4572,CONCAT(0x7e,((SELECT (ELT(4572=4572,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.

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

  • ') — закрывает ранее открытую скобку и кавычку в уязвимом запросе, чтобы внедрить свой код.
  • OR — логический оператор, который делает условие всегда истинным (или наоборот), позволяя обойти фильтрацию.
  • EXTRACTVALUE(4572, ...) — функция MySQL, извлекающая значение из XML. Если второй аргумент не является корректным XPath, она вызывает ошибку XPATH syntax error, в тексте которой выводится переданная строка.
  • CONCAT(0x7e, ((SELECT (ELT(4572=4572,1)))),0x7e) — формирует строку, где 0x7e — это тильда ~, служащая маркером начала и конца выводимых данных. ELT(4572=4572,1) возвращает 1, если условие истинно (в данном случае всегда), иначе NULL. Это простейшая проверка, которая в реальных атаках заменяется на подзапрос, извлекающий нужные данные (например, имя базы, таблицы, пароль).
  • -- - — комментарий, обрезающий оставшуюся часть оригинального SQL-запроса.

В результате выполнения такого запроса MySQL выдаст ошибку вида: ERROR 1105 (HY000): XPATH syntax error: '~1~'. Злоумышленник, видя эту ошибку, понимает, что инъекция сработала, и может подставлять в подзапрос другие выражения для получения интересующих данных.

Почему это работает?

Функция EXTRACTVALUE в MySQL (до версии 8.0) при передаче некорректного XPath-выражения генерирует ошибку, в которой отображается переданная строка. Если в эту строку внедрить результат подзапроса, он попадёт в текст ошибки и станет виден атакующему. Это один из методов error-based SQL injection.

Аналогично работают функции UPDATEXML и GTID_SUBSET (в некоторых версиях).

Пример реальной атаки

Вместо ELT(4572=4572,1) злоумышленник может подставить, например, (SELECT table_name FROM information_schema.tables LIMIT 0,1), чтобы получить имя первой таблицы. Ошибка выведет это имя, окружённое тильдами.

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

  • Используйте параметризованные запросы (prepared statements) — это самый надёжный способ.
  • Применяйте ORM (например, Hibernate, Entity Framework), которые автоматически экранируют данные.
  • Проводите валидацию и фильтрацию всех входных данных.
  • Ограничьте права пользователя БД: не давайте ему доступ к information_schema без необходимости.
  • Обновляйте MySQL до версии 8.0+, где EXTRACTVALUE удалена.
SQL-инъекции остаются в OWASP Top 10 уже много лет. По данным OWASP, это одна из самых опасных уязвимостей веб-приложений.

Заключение

Строка ') OR EXTRACTVALUE(...) — это не случайный набор символов, а рабочий эксплойт для извлечения данных из MySQL через ошибки. Понимание таких конструкций помогает разработчикам и пентестерам лучше защищать свои приложения.

Источники