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

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

Как работает EXTRACTVALUE?

Функция EXTRACTVALUE(XML, XPath) извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку вида XPATH syntax error: '...'. Злоумышленники используют это для внедрения произвольных данных в текст ошибки, которые затем можно прочитать в ответе сервера.

Разбор полезной нагрузки

Рассмотрим по частям:

  • "))) — закрывающие кавычки и скобки, чтобы завершить предыдущий SQL-запрос и добавить свой.
  • AND EXTRACTVALUE(8134, CONCAT(0x7e, ((SELECT (ELT(8134=8134,1)))), 0x7e)) — вызов функции с заведомо некорректным XPath. 0x7e — это тильда (~), используется как разделитель. ELT(8134=8134,1) возвращает 1, если условие истинно (8134=8134 — всегда истина). Это простейшая проверка, но на практике вместо 1 подставляются подзапросы, извлекающие версию БД, имена таблиц и т.д.
  • -- - — комментарий, обрезающий остаток оригинального запроса.

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

Зачем это нужно злоумышленнику?

Error-based инъекции позволяют извлекать данные из базы, даже если приложение не выводит результаты запроса напрямую. Ошибки часто отображаются в браузере или логируются, что даёт атакующему информацию о структуре БД, версии MySQL, именах таблиц и полей, а также о содержимом записей.

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

Предположим, есть уязвимый параметр id=1. Злоумышленник подставляет:

1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))

В ответе сервера появится ошибка: XPATH syntax error: '~5.7.34~'. Так узнаётся версия СУБД. Далее можно извлекать имена таблиц через information_schema.

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

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

Заключение

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

Источники