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

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

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

Разбор payload по частям

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

  • ")))) — закрывающие скобки и кавычки. Они нужны, чтобы «закрыть» легитимную часть SQL-запроса, который формирует приложение, и вставить свой код. Количество скобок подбирается экспериментально в зависимости от исходного запроса.
  • AND — логический оператор, который позволяет присоединить условие к оригинальному запросу. Если исходный запрос уже содержит условие, злоумышленник добавляет AND, чтобы внедрённая часть выполнялась только при истинности предыдущих условий (или наоборот, чтобы обойти их).
  • EXTRACTVALUE(9323, CONCAT(...)) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. При передаче некорректного XPath она генерирует ошибку, содержащую переданные данные. Это классический приём error-based SQL-инъекции: злоумышленник заставляет базу вывести нужную информацию в тексте ошибки.
  • 9323 — произвольное число, которое передаётся в качестве первого аргумента. Оно не имеет специального значения, но часто используется как идентификатор для проверки, что инъекция сработала (если число совпадает с чем-то в ответе).
  • CONCAT(0x7e, ..., 0x7e) — функция конкатенации строк. 0x7e — это шестнадцатеричное представление символа тильды (~). Тильды используются как маркеры, чтобы облегчить поиск выведенных данных в сообщении об ошибке. Внутри CONCAT помещается подзапрос.
  • (SELECT (ELT(9323=9323,1))) — подзапрос, который возвращает результат функции ELT. ELT(N, str1, str2, ...) возвращает строку по номеру N. В данном случае условие 9323=9323 всегда истинно (возвращает 1), поэтому ELT(1, 1) вернёт строку '1'. Это простейшая проверка: если инъекция работает, в ошибке появится '1' между тильдами. Злоумышленник может заменить это выражение на извлечение данных, например, версию БД или имя пользователя.
  • -- - — комментарий в SQL. Два дефиса начинают комментарий, а пробел и дефис нужны для корректного завершения строки (в некоторых СУБД требуется пробел после --). Всё, что идёт после, игнорируется базой данных. Это позволяет отбросить оставшуюся часть оригинального запроса.

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

Error-based SQL-инъекция — это техника, при которой злоумышленник извлекает данные через сообщения об ошибках, возвращаемые базой данных. Если приложение выводит ошибки СУБД на страницу (что часто случается в режиме отладки), атакующий может получить ценную информацию: версию MySQL, имена таблиц и колонок, а иногда и сами данные.

Функция EXTRACTVALUE в MySQL при передаче некорректного XPath-выражения возвращает ошибку вида: XPATH syntax error: '~1~'. Внутри кавычек оказывается то, что было передано вторым аргументом. Используя CONCAT с тильдами, злоумышленник обрамляет выводимые данные, чтобы их было легко найти в тексте ошибки.

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

Последствия успешной инъекции

Если злоумышленнику удаётся эксплуатировать уязвимость, он может:

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

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

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

Основная мера — использование параметризованных запросов (prepared statements). В этом случае пользовательский ввод передаётся отдельно от SQL-кода и не может изменить структуру запроса. Практически все современные языки программирования и библиотеки для работы с БД поддерживают такой механизм.

Дополнительные рекомендации:

  • Никогда не конкатенируйте пользовательский ввод в SQL-запросы.
  • Используйте ORM (например, Doctrine, Hibernate, Entity Framework), которые по умолчанию применяют параметризацию.
  • Ограничьте права пользователя базы данных, от имени которого работает приложение: дайте только необходимые привилегии (обычно SELECT, INSERT, UPDATE, DELETE для конкретных таблиц).
  • Отключите вывод подробных ошибок СУБД на боевом сервере — показывайте общие сообщения, а детали записывайте в лог.
  • Регулярно проводите аудит кода и используйте сканеры уязвимостей.
  • Настройте веб-application firewall (WAF) для блокировки подозрительных запросов, хотя полагаться только на него нельзя.
Важно: если вы обнаружили подобную строку в логах, это может означать, что ваш сайт пытались взломать. Проверьте целостность данных и обновите систему безопасности.

Заключение

Строка с EXTRACTVALUE и CONCAT — это типичный пример эксплойта для error-based SQL-инъекции. Понимание механики таких атак помогает разработчикам и администраторам своевременно выявлять уязвимости и принимать меры. Главное правило — не доверять пользовательскому вводу и всегда использовать параметризованные запросы. Безопасность веб-приложений требует постоянного внимания и регулярных проверок.

Источники