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

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

Подобные строки часто встречаются в логах веб-серверов или в полях ввода, когда злоумышленник пытается протестировать уязвимость сайта. В данном случае строка начинается с ))) — это попытка «закрыть» предыдущие скобки в оригинальном SQL-запросе, чтобы внедрить свой код. Затем идёт AND EXTRACTVALUE(...) — вызов функции, которая генерирует ошибку с полезной нагрузкой. В конце -- - — комментарий, который отсекает оставшуюся часть исходного запроса.

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

MySQL имеет несколько функций, которые при определённых аргументах вызывают ошибку с текстом, содержащим результат подзапроса. Одна из них — EXTRACTVALUE(). Синтаксис: EXTRACTVALUE(XML_document, XPath_expression). Если второй аргумент содержит недопустимый XPath, MySQL возвращает ошибку вида XPATH syntax error: '...', где ... — это переданная строка.

В нашем случае:

  • 7408 — произвольное число (идентификатор), не влияет на работу.
  • CONCAT(0x7e, ((SELECT (ELT(7408=7408,1)))), 0x7e) — формирует строку: ~ (0x7e) + результат подзапроса + ~.
  • ELT(7408=7408,1) — функция ELT(N, str1, str2, ...) возвращает строку под номером N. Здесь 7408=7408 — это логическое выражение, которое всегда истинно (1). Таким образом, ELT(1,1) возвращает 1.
  • Итог: CONCAT('~', '1', '~') = '~1~'.
  • Далее EXTRACTVALUE(7408, '~1~') пытается интерпретировать '~1~' как XPath. Символ ~ недопустим в XPath, поэтому MySQL выдаёт ошибку: XPATH syntax error: '~1~'.

Таким образом, в сообщении об ошибке появляется результат выполнения подзапроса. В реальной атаке вместо ELT(7408=7408,1) мог бы быть, например, (SELECT password FROM users LIMIT 1), и тогда ошибка содержала бы пароль.

Зачем злоумышленник использует такую конструкцию?

Цель — заставить сервер вернуть данные, которые обычно не отображаются на странице. Если приложение выводит сообщения об ошибках СУБД, атакующий может получить информацию о структуре базы данных, учётных записях, паролях и других конфиденциальных данных. Error-based инъекции особенно эффективны, когда нет возможности использовать UNION-запросы (например, из-за несовпадения числа столбцов).

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

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

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

  • Экранировать специальные символы (например, с помощью mysqli_real_escape_string в PHP).
  • Отключить вывод подробных ошибок СУБД в продакшене.
  • Использовать ORM или query builder, которые автоматически экранируют данные.
  • Регулярно проводить аудит безопасности и сканирование уязвимостей.

В случае с EXTRACTVALUE и подобными функциями, начиная с MySQL 5.7.8, некоторые из них могут быть отключены или работать иначе, но полагаться на это нельзя — правильная защита на уровне кода.

Пример легитимного использования EXTRACTVALUE

Функция EXTRACTVALUE предназначена для извлечения значений из XML-документов по XPath-выражению. Например:

SELECT EXTRACTVALUE('<root><user>admin</user></root>', '/root/user');

Вернёт admin. Однако в веб-приложениях её редко используют, поэтому появление EXTRACTVALUE в пользовательском вводе — почти наверняка попытка инъекции.

Вывод

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

Источники