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

Строка ')))) AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e))-- - представляет собой фрагмент SQL-кода, используемый в атаках типа SQL-инъекция (SQL injection). Она предназначена для внедрения в уязвимый параметр веб-приложения, чтобы выполнить произвольный запрос к базе данных MySQL и получить информацию об её структуре или содержимом.

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Их основная цель — обойти фильтрацию и заставить СУБД выполнить вредоносные инструкции.

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

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

1. Закрывающие скобки и кавычки

Начало строки ')))) нужно для того, чтобы «закрыть» существующий SQL-запрос, который формируется в уязвимом приложении. Например, если исходный запрос выглядит как SELECT * FROM users WHERE id = ('$input'), то вставка ')))) разрывает строку и добавляет логические условия.

2. Оператор AND и функция EXTRACTVALUE

AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e)) — это внедряемое выражение. EXTRACTVALUE() — встроенная функция MySQL, которая извлекает значение из XML-документа. Она принимает два аргумента: XML-строку и XPath-выражение. Если XPath-выражение некорректно, функция выдаёт ошибку, содержащую результат вычисления переданного выражения. Это позволяет злоумышленнику получить данные через сообщение об ошибке (техника error-based SQL injection).

3. CONCAT и шестнадцатеричные литералы

CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричное представление символа тильды (~). Тильда используется как разделитель, чтобы облегчить извлечение результата из текста ошибки.

4. Подзапрос с ELT

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

5. Комментарий в конце

-- - — это комментарий, который «отрезает» оставшуюся часть исходного SQL-запроса, чтобы синтаксис стал корректным. Пробел после двух дефисов обязателен в MySQL.

Как работает атака?

Когда уязвимое приложение подставляет пользовательский ввод в SQL-запрос без должной очистки, внедрённая строка меняет логику запроса. Например, исходный запрос:

SELECT * FROM articles WHERE id = '1'

После подстановки вредоносной строки запрос может выглядеть так:

SELECT * FROM articles WHERE id = '1')))) AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e))-- -'

База данных пытается выполнить этот запрос. Функция EXTRACTVALUE вызывает ошибку, так как второй аргумент не является корректным XPath. В тексте ошибки будет содержаться значение, возвращённое подзапросом (в данном случае «1»). Злоумышленник, анализируя ответ сервера, может получить эти данные.

В более сложных вариантах вместо ELT(2603=2603,1) подставляется запрос, извлекающий имена таблиц, колонок или конкретные записи (например, логины и пароли).

Зачем используется EXTRACTVALUE?

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

Стоит отметить, что начиная с MySQL 5.7.8 функция EXTRACTVALUE объявлена устаревшей, а в MySQL 8.0 удалена. Однако многие устаревшие системы всё ещё используют старые версии, поэтому атака остаётся актуальной.

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

Основная мера — использование параметризованных запросов (prepared statements) и хранимых процедур. Никогда не конкатенируйте пользовательский ввод в SQL-запрос. Также рекомендуется:

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

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

Заключение

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

Источники