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

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

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

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

Error-based SQL-инъекция — это техника, при которой атакующий заставляет базу данных выдать сообщение об ошибке, содержащее полезные данные. В MySQL некоторые функции при некорректных аргументах возвращают ошибку с частью переданного значения. Например, функция EXTRACTVALUE(XML_document, XPath_expression) при передаче некорректного XPath-выражения может выдать ошибку, включающую это выражение. Если в выражение подставить результат подзапроса, то этот результат попадёт в текст ошибки и станет виден атакующему.

В анализируемой строке используется именно этот приём: EXTRACTVALUE(5736, CONCAT(0x7e, (SELECT ...), 0x7e)). Символ 0x7e — это тильда (~), которая используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.

Разбор составных частей строки

  • ")))) — закрывающие кавычки и скобки, которые завершают предыдущее выражение в уязвимом запросе и подготавливают место для инъекции.
  • AND — логический оператор, добавляющий условие к исходному запросу.
  • EXTRACTVALUE(5736, ...) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Первый аргумент (5736) — произвольное число, второй — XPath-выражение, сформированное динамически.
  • CONCAT(0x7e, ((SELECT (ELT(5736=5736,1)))), 0x7e) — конкатенация тильды, результата подзапроса и ещё одной тильды. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Выражение 5736=5736 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. В реальной атаке вместо этого выражения был бы подзапрос, извлекающий данные (например, имя пользователя или пароль).
  • -- - — комментарий, который игнорирует оставшуюся часть исходного SQL-запроса, чтобы не вызвать синтаксическую ошибку.

Таким образом, при выполнении уязвимого запроса с внедрённой строкой MySQL попытается вычислить EXTRACTVALUE с некорректным XPath (содержащим тильды), что приведёт к ошибке вида XPATH syntax error: '~1~'. В сообщении об ошибке появится значение, возвращённое подзапросом, — в данном примере это '1', но в реальной атаке там могли бы быть конфиденциальные данные.

Цель использования такой инъекции

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

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

Как защититься от SQL-инъекций?

Для предотвращения SQL-инъекций необходимо применять комплекс мер:

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

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

Заключение

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

Источники