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

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

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

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

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

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

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

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

В результате MySQL попытается извлечь XPath из строки ~1~ (если подставить реальные данные, там будет что-то другое). Поскольку это невалидный XPath, возникнет ошибка вида: XPATH syntax error: '~1~'. В этом сообщении и «утечёт» результат подзапроса.

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

Цель — получить информацию из базы данных, когда другие методы (например, UNION-based) не работают. Error-based инъекции позволяют посимвольно извлекать имена таблиц, колонок, логины и пароли пользователей. В данном примере подзапрос возвращает просто «1», но если заменить его на (SELECT password FROM users LIMIT 1), в ошибке отобразится пароль.

Такие запросы часто автоматизируются с помощью инструментов вроде sqlmap. Они могут быть частью сканирования уязвимостей или реальной атаки.

Чем опасна такая строка для сайта?

Если вы обнаружили подобную строку в логах, это сигнал, что кто-то пытался проэксплуатировать ваш сайт. Последствия успешной инъекции:

  • Утечка конфиденциальных данных (пароли, персональные данные клиентов).
  • Полная компрометация базы данных.
  • Возможность выполнения произвольных SQL-запросов, включая удаление или изменение данных.
  • В некоторых случаях — выполнение команд на сервере.

Даже если атака не удалась, сам факт говорит о наличии уязвимости или о том, что сайт сканируют.

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

  1. Используйте подготовленные выражения (prepared statements). Это самый надёжный способ. Параметризованные запросы не позволяют внедрить SQL-код.
  2. Экранируйте специальные символы. Если подготовленные выражения недоступны, применяйте функции экранирования, например mysqli_real_escape_string.
  3. Ограничьте права пользователя БД. Не давайте веб-приложению прав на удаление таблиц или доступ к системным таблицам.
  4. Включите логирование и мониторинг. Анализируйте подозрительные запросы, настройте оповещения.
  5. Регулярно обновляйте СУБД и фреймворки. Устаревшие версии могут содержать дополнительные уязвимости.
  6. Используйте WAF (Web Application Firewall). Он может блокировать типовые атаки на основе сигнатур.

Если вы нашли такую строку в логах, рекомендуется немедленно провести аудит кода на предмет SQL-инъекций и проверить, не была ли атака успешной.

Частые вопросы

Это вирус?

Нет, это не вирус, а попытка эксплуатации уязвимости. Сама по себе строка безвредна, если сервер не выполняет её как SQL-код.

Может ли такая строка появиться случайно?

Крайне маловероятно. Обычно это результат целенаправленных действий или автоматизированного сканера.

Что делать, если я увидел это в своём логе?

Проверьте, не было ли успешных инъекций, обновите код, использующий SQL-запросы, и настройте фильтрацию ввода.

Помните: безопасность — это процесс, а не разовое действие. Регулярно проверяйте свои приложения на уязвимости.

Источники