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

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

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL. Если вы увидели её в своих логах — это попытка взлома или сканирования вашего сайта. Если вы разработчик и нашли её в коде — возможно, ваше приложение уязвимо.

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

Давайте разберём каждый элемент этой конструкции.

1. %'))))

Этот фрагмент — попытка «закрыть» предыдущие SQL-выражения и выйти за пределы ожидаемого контекста. Символ % часто используется как подстановочный знак в LIKE-запросах. Далее идут закрывающие кавычка и скобки: ')))). Злоумышленник предполагает, что в исходном запросе уже есть открытые скобки и кавычки, и пытается их закрыть, чтобы вставить свой код.

2. AND EXTRACTVALUE(5693, CONCAT(...))

EXTRACTVALUE — это функция MySQL для работы с XML. Она извлекает значение из XML-фрагмента по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(xml_frag, xpath_expr). Если XPath-выражение некорректно, функция генерирует ошибку, в тексте которой может содержаться переданный фрагмент.

В нашем случае первый аргумент — 5693 (произвольное число), второй — результат CONCAT.

3. CONCAT(0x7e, ((SELECT (ELT(5693=5693,1)))), 0x7e)

CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Он используется как разделитель, чтобы облегчить поиск данных в сообщении об ошибке.

Внутри — подзапрос SELECT (ELT(5693=5693,1)). ELT — функция MySQL, возвращающая N-й элемент из списка. Здесь ELT(5693=5693,1): условие 5693=5693 всегда истинно (возвращает 1), поэтому ELT вернёт первый элемент — число 1. Это простейшая проверка, что инъекция выполняется. В реальной атаке вместо 1 могло бы быть имя базы данных, таблицы или хеш пароля.

4. -- -

Это комментарий в SQL. Два дефиса с пробелом (или -- ) означают, что весь оставшийся код запроса игнорируется. Это позволяет злоумышленнику «отрезать» лишнюю часть оригинального запроса, чтобы синтаксис оставался корректным.

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

MySQL при неправильном XPath-выражении в EXTRACTVALUE выдаёт ошибку вида:

XPATH syntax error: '~1~'

Злоумышленник может подставить вместо 1 любой другой запрос, например (SELECT version()), и в тексте ошибки увидеть версию СУБД. Пошагово извлекая данные через такие ошибки, атакующий может получить имена таблиц, столбцов и даже содержимое базы.

Это один из самых простых и эффективных методов, если приложение выводит ошибки СУБД на экран. Даже если ошибки не показываются, они могут попадать в логи, к которым у злоумышленника может быть доступ.

Чем опасна такая инъекция?

  • Утечка данных: злоумышленник может читать любые таблицы, к которым имеет доступ пользователь БД.
  • Обход аутентификации: с помощью инъекции можно войти в систему без пароля.
  • Изменение или удаление данных: в зависимости от прав, можно выполнять UPDATE, DELETE, DROP.
  • Компрометация сервера: в некоторых случаях через SQL-инъекцию можно выполнить команды ОС.

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

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

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

Это признак того, что ваш сайт сканируют на уязвимости. Если вы не используете MySQL или не выводите ошибки, скорее всего, атака не удалась. Но стоит проверить:

  • Нет ли в приложении динамических SQL-запросов без параметризации.
  • Не отображаются ли ошибки БД пользователям.
  • Не было ли успешных попыток эксплуатации (например, странных запросов к БД).

Рекомендуется провести аудит кода и настроек безопасности.

Заключение

Строка %')))) AND EXTRACTVALUE(5693,CONCAT(0x7e,((SELECT (ELT(5693=5693,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка SQL-инъекции через функцию EXTRACTVALUE. Понимание механики таких атак помогает разработчикам и администраторам лучше защищать свои системы. Никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.

Источники

  • SQL Injection — Wikipedia