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

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

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Они могут быть как попыткой взлома, так и результатом работы автоматических сканеров уязвимостей.

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

Основная идея метода: заставить базу данных выполнить такой запрос, который вернёт в тексте ошибки конфиденциальную информацию. В MySQL для этого часто используют функции EXTRACTVALUE() и UPDATEXML().

Функция EXTRACTVALUE(XML_document, XPath_expression) извлекает значение из XML-документа по заданному XPath-выражению. Если XPath содержит недопустимые символы, MySQL выдаёт ошибку, в которой отображается переданное значение. Это и позволяет злоумышленнику «вытащить» данные.

Разбор конкретной строки

  • ))) — закрывающие скобки, которые завершают предыдущий запрос (нужны для корректного внедрения).
  • AND EXTRACTVALUE(6086, ...) — вызов функции с первым аргументом 6086 (произвольное число, часто используется как идентификатор).
  • CONCAT(0x7e, ((SELECT (ELT(6086=6086,1)))), 0x7e) — конкатенация тильды (~, код 0x7e), результата подзапроса и ещё одной тильды.
  • SELECT (ELT(6086=6086,1)) — подзапрос, который возвращает 1, если условие истинно (6086=6086 всегда истина), или NULL в противном случае. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь N=1, поэтому возвращается 1.
  • -- - — комментарий, который «отрезает» оставшуюся часть оригинального SQL-запроса.

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

Пример реальной ошибки: XPATH syntax error: '~root@localhost~' — так злоумышленник может узнать имя пользователя базы данных.

Цели злоумышленника

Основные цели error-based инъекций:

  • Получение версии СУБД (например, SELECT VERSION()).
  • Извлечение имён таблиц и колонок из information_schema.
  • Чтение логинов и паролей пользователей.
  • Получение другой конфиденциальной информации.

Часто такие строки — часть автоматизированного сканирования, например, с помощью sqlmap. Если вы видите подобное в логах, это повод проверить безопасность вашего веб-приложения.

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

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

Дополнительные меры:

  1. Экранирование специальных символов (но это менее надёжно, чем параметризация).
  2. Ограничение прав пользователя базы данных (принцип наименьших привилегий).
  3. Валидация и фильтрация входных данных на стороне сервера.
  4. Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
  5. Регулярное обновление СУБД и фреймворков.

Если вы разработчик, всегда проверяйте, что все запросы к базе данных используют подготовленные выражения. Не конкатенируйте пользовательский ввод в SQL-строки.

Что делать, если вы нашли такую строку в логах?

Не паникуйте, но отнеситесь серьёзно. Проверьте, не была ли атака успешной. Просмотрите логи веб-сервера и базы данных на предмет необычных запросов. Если есть подозрения на утечку, немедленно смените пароли и обновите уязвимые компоненты.

Помните: ошибки базы данных не должны отображаться пользователю. Настройте вывод общих сообщений об ошибках, а детали записывайте в защищённый лог.

Заключение

Строка EXTRACTVALUE(6086,CONCAT(0x7e,...)) — это не случайный набор символов, а целенаправленная попытка эксплуатировать уязвимость SQL-инъекции. Понимание принципов её работы помогает разработчикам и администраторам лучше защищать свои системы. Используйте параметризованные запросы, следите за обновлениями и не оставляйте базы данных без защиты.

Источники