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

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

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

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

Рассмотрим каждый компонент запроса:

  • %') — это попытка закрыть ранее открытую кавычку и скобку в уязвимом SQL-запросе. Символ % часто используется в URL-кодировании, но здесь он может быть частью строки, которая передаётся в параметре. Комбинация ') закрывает строковый литерал и круглую скобку, чтобы внедрить свой код.
  • AND EXTRACTVALUE(6263,CONCAT(0x7e,((SELECT (ELT(6263=6263,1)))),0x7e)) — это вызов функции EXTRACTVALUE, которая в MySQL предназначена для извлечения значения из XML-документа по XPath-выражению. Однако при передаче некорректного XPath-выражения она генерирует ошибку, содержащую переданные данные. Это и используется для вывода информации.
  • -- - — это комментарий, который отсекает оставшуюся часть оригинального запроса, чтобы он оставался синтаксически корректным.

Как работает EXTRACTVALUE в контексте инъекции

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

В нашем случае:

  • CONCAT(0x7e, ((SELECT (ELT(6263=6263,1)))), 0x7e) — формирует строку, начиная и заканчивая символом ~ (0x7e в шестнадцатеричном виде). Внутри — подзапрос SELECT (ELT(6263=6263,1)).
  • ELT(N, str1, str2, ...) — функция, возвращающая N-ю строку из списка. Здесь ELT(6263=6263, 1) вернёт 1, так как условие 6263=6263 истинно (равно 1). То есть подзапрос вернёт строку '1'.
  • Итоговое XPath-выражение будет ~1~, что не является корректным XPath. MySQL выдаст ошибку, в которой отобразится ~1~. Это простейший пример, демонстрирующий работу метода. В реальных атаках вместо ELT(6263=6263,1) подставляются подзапросы, извлекающие имена таблиц, колонок, пароли и т.д.

Таким образом, данная конструкция — это «пробный шар», проверка уязвимости. Если сервер возвращает ошибку с ~1~, значит, инъекция возможна, и можно переходить к извлечению данных.

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

Error-based инъекции — один из самых быстрых способов получить информацию из базы, когда приложение выводит сообщения об ошибках СУБД. В отличие от blind-инъекций, где данные извлекаются по крупицам через логические условия, здесь можно за один запрос получить целую строку данных. Функция EXTRACTVALUE — не единственная; также используются UPDATEXML, GTID_SUBSET и другие функции, вызывающие ошибки с полезной нагрузкой.

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

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

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

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

Пример уязвимого кода

Рассмотрим фрагмент на PHP, который может быть уязвим:

$id = $_GET['id'];
$query = "SELECT * FROM users WHERE name = '$id'";
$result = mysqli_query($connection, $query);

Если передать в параметр id строку %') AND EXTRACTVALUE(...)-- -, то запрос превратится в:

SELECT * FROM users WHERE name = '%') AND EXTRACTVALUE(6263,CONCAT(0x7e,((SELECT (ELT(6263=6263,1)))),0x7e))-- -'

Как видим, кавычка и скобка закрываются, добавляется вызов функции, а остаток запроса комментируется. Это классическая демонстрация.

Заключение

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

Источники