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

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

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

Разбор компонентов инъекции

Рассмотрим каждый элемент строки подробно.

1. OR

Логический оператор OR используется для добавления условия, которое всегда истинно или приводит к выполнению полезной нагрузки. В контексте инъекции он позволяет обойти ограничения исходного запроса, например, сделать условие WHERE всегда истинным или выполнить функцию, даже если исходное условие ложно.

2. EXTRACTVALUE(6944, CONCAT(...))

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

В нашем случае первый аргумент — число 6944 (произвольное число, не являющееся корректным XML), а второй аргумент формируется через CONCAT.

3. CONCAT(0x7e, ((SELECT (ELT(6944=6944,1)))), 0x7e)

Функция CONCAT объединяет строки. Здесь она склеивает:

  • 0x7e — шестнадцатеричное представление символа ~ (тильда). Этот символ часто используется как маркер начала и конца извлекаемых данных, чтобы облегчить их поиск в сообщении об ошибке.
  • Результат подзапроса ((SELECT (ELT(6944=6944,1)))).
  • Снова 0x7e для обрамления.

4. ELT(6944=6944,1)

ELT — функция MySQL, возвращающая N-й элемент из списка строк. Первый аргумент — число (позиция), второй и последующие — строки. В данном случае 6944=6944 возвращает логическое 1 (истина), поэтому ELT(1,1) вернёт строку '1'. Это простейшая полезная нагрузка, которая могла бы быть заменена на любой другой подзапрос, например SELECT password FROM users LIMIT 1.

5. -- -

Комментарий в SQL. Два дефиса с пробелом (или без) начинают комментарий до конца строки. Это позволяет отбросить оставшуюся часть исходного запроса, чтобы синтаксис не нарушался. Дефис в конце добавляется для надёжности, так как некоторые парсеры требуют пробела после --.

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

Механизм следующий:

  1. Приложение получает от пользователя данные (например, параметр URL) и вставляет их в SQL-запрос без должной обработки.
  2. Злоумышленник передаёт строку, которая меняет логику запроса и вызывает выполнение функции EXTRACTVALUE с некорректным XPath.
  3. MySQL выполняет запрос и при попытке разобрать XPath-выражение генерирует ошибку вида: XPATH syntax error: '~1~'.
  4. Если приложение выводит сообщения об ошибках БД на страницу, злоумышленник видит результат подзапроса (в примере — 1).
  5. Заменяя подзапрос, атакующий может извлекать произвольные данные: имена таблиц, логины, пароли и т.д.

Важно отметить, что EXTRACTVALUE возвращает ошибку только если второй аргумент не является корректным XPath. Символ ~ в начале и конце гарантирует, что выражение будет невалидным, и ошибка точно возникнет.

Реальная опасность и последствия

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

Согласно отчётам OWASP, SQL-инъекции остаются одной из самых распространённых уязвимостей веб-приложений. Внедрение подобных строк в параметры — типичный признак сканирования уязвимостей или целенаправленной атаки.

Как защититься от подобных инъекций

Основные меры защиты:

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

Также рекомендуется проводить аудит кода и тестирование на проникновение для выявления подобных уязвимостей.

Пример легитимного использования EXTRACTVALUE

Функция EXTRACTVALUE не является «вредоносной» сама по себе. Она предназначена для работы с XML-данными в MySQL. Например, если в таблице хранится XML-документ, можно извлечь значение по XPath:

SELECT EXTRACTVALUE('<root><item>значение</item></root>', '/root/item');

Результат: значение. Однако в руках злоумышленника эта функция превращается в инструмент атаки. Поэтому важно контролировать, какие функции доступны пользователям базы данных, и ограничивать права.

Заключение

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

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

Источники