Что это за запрос

Перед нами фрагмент, который часто встречается в атаках на веб-приложения: ")) AND EXTRACTVALUE(6535,CONCAT(0x7e,((SELECT (ELT(6535=6535,1)))),0x7e))-- -. Это классический пример SQL-инъекции (SQL injection) на основе ошибок (error-based). Злоумышленник пытается внедрить свой код в SQL-запрос, который выполняется на сервере базы данных, чтобы получить информацию или обойти аутентификацию.

В данном случае используются функции MySQL: EXTRACTVALUE и ELT. Запрос сконструирован так, чтобы вызвать ошибку, в тексте которой будут содержаться нужные злоумышленнику данные. Давайте разберём каждый элемент.

Синтаксис и назначение функций

EXTRACTVALUE

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

ELT

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В нашем payload: ELT(6535=6535,1). Выражение 6535=6535 всегда истинно (1), поэтому ELT возвращает первый элемент — строку '1'. Это простой способ получить константу, но в реальных атаках вместо '1' может быть подзапрос, извлекающий данные (например, имя пользователя или пароль).

CONCAT и 0x7e

CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы облегчить поиск извлечённых данных в тексте ошибки. Часто в error-based инъекциях применяют именно такой приём: оборачивают полезную нагрузку в символы, которые легко заметить.

Как работает внедрение

Предположим, исходный запрос выглядит так: SELECT * FROM users WHERE id = '" + input + "'. Злоумышленник подставляет свою строку. В нашем случае payload начинается с ")) — это попытка закрыть скобки и кавычки, чтобы разорвать оригинальный запрос и добавить условие AND EXTRACTVALUE(...). Затем следует комментарий -- -, который «съедает» оставшуюся часть исходного запроса.

В результате сервер выполняет что-то вроде:

SELECT * FROM users WHERE id = '")) AND EXTRACTVALUE(6535,CONCAT(0x7e,((SELECT (ELT(6535=6535,1)))),0x7e))-- -'

Функция EXTRACTVALUE получает первым аргументом число 6535 (некорректный XML), а вторым — строку, начинающуюся с тильды. Так как первый аргумент не является XML-документом, MySQL выдаёт ошибку, в тексте которой будет второй аргумент, то есть ~1~. Если бы вместо ELT(6535=6535,1) стоял подзапрос, например (SELECT password FROM users LIMIT 1), то в ошибке отобразился бы пароль.

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

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

Меры защиты

  • Параметризованные запросы (prepared statements) — главный способ предотвращения SQL-инъекций. Они отделяют код от данных.
  • Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером базы данных (например, mysqli_real_escape_string в PHP), но это менее надёжно, чем параметризация.
  • Валидация и фильтрация входных данных — проверяйте типы, форматы, ограничивайте длину.
  • Минимальные привилегии для учётной записи БД — не давайте приложению прав на чтение системных таблиц и выполнение опасных функций.
  • Отключение подробных сообщений об ошибках на production-серверах, чтобы не давать злоумышленнику информацию.
  • Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
Важно: даже если вы не используете MySQL, аналогичные техники существуют и для других СУБД. Универсальная защита — параметризация запросов и строгая валидация.

Вывод

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

Источники