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