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

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

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

Разбор структуры инъекции

Начнём с начала строки: %")))). Символ % часто используется как URL-кодированный пробел или часть LIKE-запроса. Далее идут закрывающие кавычка и скобки. Их цель — «закрыть» предполагаемый SQL-запрос, который выполняет сайт. Например, если исходный запрос был SELECT * FROM users WHERE name = '$input', то подстановка такой строки разорвёт кавычки и позволит добавить собственный код.

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

Число 7601 — это произвольный идентификатор, который не несёт смысловой нагрузки. Его можно заменить на любое другое число. Он нужен лишь для того, чтобы запрос выглядел правдоподобно.

Далее идёт CONCAT(0x7e,((SELECT (ELT(7601=7601,1)))),0x7e). Функция CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа тильды ~. Он используется как маркер, чтобы в сообщении об ошибке было легко найти начало и конец внедрённых данных. Внутри CONCAT находится подзапрос SELECT (ELT(7601=7601,1)). Функция ELT() возвращает N-й элемент из списка. Здесь 7601=7601 — это всегда истинное условие, которое возвращает 1, а ELT(1,1) вернёт первый элемент, то есть 1. Это простейшая проверка работоспособности инъекции: если ошибка появится, значит, уязвимость есть.

Завершают строку символы -- -. Это комментарий в SQL. Всё, что идёт после --, игнорируется базой данных. Пробел после дефисов нужен, чтобы некоторые парсеры корректно распознали комментарий. Таким образом, злоумышленник «отрезает» остаток оригинального запроса, чтобы не вызвать синтаксическую ошибку.

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

Error-based SQL-инъекция — это метод, при котором атакующий заставляет базу данных выдать данные в тексте ошибки. В MySQL для этого часто используют функции EXTRACTVALUE() и UPDATEXML(). Обе они принимают XML-строку и XPath-выражение. Если XPath содержит недопустимые символы, MySQL возвращает ошибку вида: XPATH syntax error: '~данные~'.

Злоумышленник подставляет в XPath результат подзапроса, обёрнутый в тильды. База данных пытается распарсить это как XPath, терпит неудачу и выводит сообщение, содержащее эти самые данные. Так через ошибку можно получить имена таблиц, столбцов, логины, пароли и другую конфиденциальную информацию.

Важно: error-based инъекции работают только тогда, когда веб-приложение отображает сообщения об ошибках базы данных пользователю. Если ошибки скрыты, атакующий переходит к blind-инъекциям.

Почему это опасно?

SQL-инъекции остаются одной из самых распространённых уязвимостей веб-приложений. По данным OWASP, они входят в топ-10 критических рисков. Успешная эксплуатация может привести к:

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

Конкретно строка с EXTRACTVALUE — это лишь разведка. Если она сработает, злоумышленник начнёт извлекать данные по частям, используя LIMIT и OFFSET, или применит более сложные техники.

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

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

  1. Используйте подготовленные выражения во всех языках программирования: PDO в PHP, psycopg2 в Python, JDBC в Java и т.д.
  2. Экранируйте специальные символы, если параметризация невозможна. Но помните, что экранирование — менее надёжный метод.
  3. Ограничьте права пользователя базы данных. Приложение должно работать под учётной записью с минимально необходимыми привилегиями.
  4. Отключите вывод ошибок БД в production-окружении. Ошибки должны логироваться, но не показываться пользователю.
  5. Регулярно обновляйте СУБД и фреймворки, чтобы закрыть известные уязвимости.
  6. Используйте WAF (Web Application Firewall) для фильтрации подозрительных запросов. Однако WAF — это дополнительный барьер, а не замена правильному кодированию.

Если вы нашли такую строку в логах, стоит проверить, не была ли атака успешной. Обратите внимание на необычные запросы к базе, попытки доступа к системным таблицам (information_schema), а также на изменения в данных.

Что делать, если вы увидели эту строку?

Прежде всего, не паникуйте. Одна попытка инъекции ещё не означает, что сайт взломан. Однако это сигнал о необходимости проверить безопасность. Вот примерный план действий:

  • Проверьте логи веб-сервера и базы данных на предмет других подозрительных запросов.
  • Убедитесь, что все формы и параметры URL обрабатываются через параметризованные запросы.
  • Проведите сканирование уязвимостей с помощью инструментов вроде SQLmap или OWASP ZAP.
  • Если есть сомнения, обратитесь к специалистам по информационной безопасности.

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

Заключение

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

Источники