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

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

В данной статье мы разберём каждый элемент этой строки, объясним, как она работает, и покажем, почему она опасна для веб-приложений, не защищённых от SQL-инъекций.

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

Начнём с начала строки:

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

Как работает EXTRACTVALUE в этой инъекции?

Функция EXTRACTVALUE(XML, XPath) принимает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно или возвращает не то, что ожидается, MySQL выдаёт ошибку. В контексте SQL-инъекции злоумышленник намеренно вызывает такую ошибку, чтобы в тексте ошибки отобразились данные, полученные из подзапроса.

В нашем случае вторым аргументом идёт CONCAT(0x7e, ((SELECT (ELT(5431=5431,1)))), 0x7e). Функция CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.

Что делает ELT(5431=5431,1)?

Выражение ELT(5431=5431,1) — это функция ELT (от англ. element), которая возвращает N-й элемент из списка. Первый аргумент — 5431=5431 — это логическое выражение, которое всегда истинно (1). Второй аргумент — 1. Таким образом, ELT(1,1) вернёт первый элемент списка, то есть 1. Это простейший случай, демонстрирующий работу инъекции. В реальной атаке вместо 1 мог бы стоять подзапрос, возвращающий имя пользователя, пароль или другую конфиденциальную информацию.

Итак, CONCAT(0x7e, 1, 0x7e) вернёт строку ~1~.

Почему возникает ошибка?

Функция EXTRACTVALUE ожидает, что второй аргумент будет корректным XPath-выражением. Строка ~1~ не является валидным XPath. Поэтому MySQL генерирует ошибку вида: XPATH syntax error: '~1~'. В этой ошибке и содержится результат выполнения подзапроса — в данном случае просто 1. Если бы вместо 1 был подзапрос, возвращающий, например, версию базы данных, то в ошибке отобразилась бы эта версия.

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

Основная цель — получить информацию о базе данных, которую невозможно извлечь обычными средствами. Error-based инъекции позволяют:

  • Определить версию СУБД.
  • Получить имена таблиц и столбцов.
  • Извлечь логины и пароли пользователей.
  • Читать произвольные данные из базы.

В данном примере строка с ELT(5431=5431,1) — это, скорее, тестовая проверка уязвимости. Если сервер возвращает ошибку с ~1~, значит, приложение уязвимо и можно переходить к более сложным запросам.

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

Лучший способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому введённые пользователем строки никогда не интерпретируются как SQL-код. Дополнительные меры:

  • Экранирование специальных символов.
  • Ограничение прав пользователя базы данных (принцип наименьших привилегий).
  • Отключение вывода подробных ошибок в production-окружении.
  • Использование WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Важно: даже если ошибка не выводится пользователю, она может быть записана в логи, где злоумышленник сможет её прочитать при наличии доступа.

Заключение

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

Источники