Что это за строка?
Строка )) AND EXTRACTVALUE(2680,CONCAT(0x7e,((SELECT (ELT(2680=2680,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер базы данных.
Подобные строки часто встречаются в логах веб-серверов, в параметрах URL или в полях форм, когда кто-то пытается проверить уязвимость сайта. Если вы увидели такую запись — это почти наверняка попытка взлома или сканирования.
Разбор синтаксиса
Давайте разберём каждый элемент этой конструкции.
Закрывающие скобки ))
Две закрывающие скобки в начале обычно указывают на то, что инъекция внедряется в существующий SQL-запрос, где уже есть открытые скобки. Например, оригинальный запрос мог выглядеть так: SELECT * FROM users WHERE id = ((1)). Злоумышленник добавляет )), чтобы закрыть имеющиеся скобки и продолжить внедрение.
Оператор AND
Логический оператор AND используется для объединения условий. В контексте инъекции он позволяет добавить новое условие, которое будет выполнено только если предыдущее истинно. Это нужно, чтобы внедряемая функция выполнилась и вызвала ошибку.
Функция EXTRACTVALUE()
EXTRACTVALUE() — это встроенная функция MySQL (до версии 8.0.17), предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_fragment, XPath_expression).
Однако при неправильном использовании она генерирует ошибку, которая содержит переданные аргументы. Именно это и эксплуатируют злоумышленники: они передают в функцию специально сформированную строку, чтобы в тексте ошибки вернулись данные из базы.
Начиная с MySQL 8.0.17 функция EXTRACTVALUE() помечена как устаревшая и в новых версиях может быть удалена.
Функция CONCAT() и шестнадцатеричный литерал 0x7e
CONCAT() объединяет строки. Здесь она склеивает символ ~ (тильда, код 0x7e в шестнадцатеричном представлении), результат подзапроса и ещё одну тильду. Тильда используется как маркер, чтобы облегчить поиск выводимых данных в сообщении об ошибке.
Подзапрос SELECT (ELT(2680=2680,1))
Внутренний подзапрос SELECT (ELT(2680=2680,1)) — это демонстрация возможности выполнения произвольных SQL-выражений. Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 2680=2680 — всегда истинное условие, которое возвращает 1, поэтому ELT(1,1) вернёт строку '1'.
В реальной атаке вместо этого подзапроса злоумышленник подставил бы запрос к системным таблицам, например: SELECT version() или SELECT table_name FROM information_schema.tables. Таким образом, в ошибке EXTRACTVALUE вернулась бы версия СУБД или имена таблиц.
Комментарий -- -
Двойной дефис с пробелом — это комментарий в SQL. Он отсекает остаток оригинального запроса, чтобы синтаксис оставался корректным. Пробел после -- обязателен в MySQL, иначе комментарий не распознается.
Как работает атака
Предположим, на сервере выполняется запрос:
SELECT * FROM articles WHERE id = ((1)) AND EXTRACTVALUE(2680,CONCAT(0x7e,((SELECT (ELT(2680=2680,1)))),0x7e))-- -
СУБД попытается вычислить EXTRACTVALUE(2680, ...). Первый аргумент — число 2680, которое не является корректным XML-документом. Это вызовет ошибку вида:
XPATH syntax error: '~1~'
В сообщении об ошибке появятся данные, которые злоумышленник передал через CONCAT. Если вместо ELT(2680=2680,1) подставить SELECT database(), то в ошибке отобразится имя текущей базы данных.
Таким образом, атакующий может последовательно извлекать информацию: версию MySQL, имена таблиц, столбцов, логины и пароли пользователей.
Чем опасна error-based SQL-инъекция
- Утечка конфиденциальных данных: злоумышленник может получить доступ к персональным данным, паролям, платёжной информации.
- Компрометация всей базы: через information_schema можно узнать структуру БД и затем извлечь любые таблицы.
- Обход аутентификации: иногда с помощью инъекций можно войти в систему как администратор.
- Выполнение произвольных команд: в некоторых конфигурациях возможна загрузка файлов или выполнение кода на сервере.
Как защититься
Основной способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Никогда не подставляйте пользовательские данные в SQL-запросы напрямую через конкатенацию строк.
Дополнительные меры:
- Валидация входных данных: проверяйте, что параметры соответствуют ожидаемому типу (число, email и т.д.).
- Экранирование специальных символов: используйте функции экранирования, предоставляемые драйвером БД.
- Ограничение прав пользователя БД: веб-приложение должно работать под учётной записью с минимально необходимыми правами.
- Регулярное обновление СУБД: в новых версиях MySQL уязвимые функции вроде EXTRACTVALUE удалены или исправлены.
- Использование WAF: веб-приложения firewalls могут блокировать подозрительные запросы, содержащие SQL-конструкции.
- Логирование и мониторинг: отслеживайте попытки инъекций, чтобы своевременно реагировать.
Что делать, если вы увидели такую строку в логах
Если вы администратор сайта и обнаружили подобные записи в логах, это означает, что ваш ресурс пытались взломать. Необходимо:
- Проверить, не произошла ли утечка данных.
- Убедиться, что все формы и параметры URL обрабатываются безопасно.
- Провести аудит кода на предмет наличия уязвимостей.
- Обновить CMS и библиотеки до актуальных версий.
- Настроить фильтрацию входящих запросов.
Помните: даже если атака не удалась, она может быть частью более масштабной кампании по поиску уязвимостей.
Заключение
Строка )) AND EXTRACTVALUE(2680,CONCAT(0x7e,((SELECT (ELT(2680=2680,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции в MySQL. Она демонстрирует, как злоумышленники используют особенности функций СУБД для извлечения данных через сообщения об ошибках. Понимание таких конструкций помогает разработчикам и администраторам лучше защищать свои системы.
Комментарии
—Войдите, чтобы оставить комментарий