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

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

Внешне это выглядит как набор случайных символов, но на самом деле каждый элемент здесь имеет строгое назначение. Разберём по частям.

Анатомия инъекции

Рассмотрим фрагменты запроса:

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

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

MySQL-функция EXTRACTVALUE(XML, XPath) предназначена для извлечения данных из XML-документа. Если переданный XML-фрагмент содержит недопустимые символы (например, тильду), СУБД генерирует ошибку вида:

XPATH syntax error: '~1~'

Именно этот текст ошибки возвращается атакующему. Подставляя в подзапрос вместо «1» другие выражения, злоумышленник может пошагово извлекать данные: имена таблиц, столбцов, логины, пароли. Например, заменив ELT(1687=1687,1) на SELECT database(), он получит имя текущей базы данных в сообщении об ошибке.

Подобный подход называется error-based SQL injection. Он особенно удобен, когда нет возможности использовать UNION-запросы или слепые методы (blind SQLi), а сервер выводит сообщения об ошибках.

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

Основная цель — получить доступ к конфиденциальной информации, хранящейся в базе данных. Это могут быть:

  • учётные данные пользователей (логины, пароли, хэши);
  • персональные данные клиентов;
  • номера банковских карт;
  • служебная информация о структуре БД.

Кроме того, успешная инъекция может привести к полному захвату сервера, если у атакующего есть возможность выполнять произвольные SQL-запросы, например, через LOAD_FILE или INTO OUTFILE.

Примеры других вариаций

Встречаются аналогичные строки с функциями UPDATEXML или GTID_SUBSET. Например:

) OR EXTRACTVALUE(2279,CONCAT(0x7e,((SELECT (ELT(2279=2279,1)))),0x7e))-- -

Принцип тот же: вызвать ошибку, содержащую результат подзапроса. Числа 1687, 2279 — произвольные идентификаторы, часто используемые для уникализации или обхода простых фильтров.

Как защититься от таких атак

Надёжная защита от SQL-инъекций, включая error-based, строится на нескольких уровнях:

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

Важно понимать, что ни один метод не даёт 100% гарантии, поэтому рекомендуется комбинировать несколько подходов.

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

Если вы администратор и видите подобные записи в логах, это может означать, что ваш сайт пытались взломать. Действия:

  • Проверьте, не уязвимо ли приложение: протестируйте формы и параметры на наличие SQL-инъекций.
  • Обновите CMS и библиотеки до актуальных версий.
  • Просмотрите код на предмет использования небезопасных запросов.
  • Усильте мониторинг и настройте оповещения о подозрительной активности.

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

Заключение

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

Источники