Что это за строка?
Строка ")) AND EXTRACTVALUE(7245,CONCAT(0x7e,((SELECT (ELT(7245=7245,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в отчётах пентестеров и в логах веб-серверов при попытках взлома.
Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Давайте разберём его по частям.
Анатомия инъекции
Разберём строку по компонентам:
"))— закрывающие кавычка и скобка. Они нужны, чтобы «закрыть» оригинальный SQL-запрос и вставить свой код. Количество скобок и тип кавычки подбираются под конкретный уязвимый запрос.AND— логический оператор, присоединяющий наше условие к исходному запросу.EXTRACTVALUE(7245, ...)— функция MySQL для работы с XML. Она извлекает значение из XML-документа по XPath-выражению. Если XPath некорректен, MySQL выдаёт ошибку, в тексте которой может содержаться переданная строка.CONCAT(0x7e, ..., 0x7e)— конкатенация строк.0x7e— это шестнадцатеричный код символа~(тильда). Тильды используются как маркеры, чтобы в сообщении об ошибке легко было найти внедрённые данные.(SELECT (ELT(7245=7245,1)))— подзапрос, возвращающий результат.ELT()возвращает N-й элемент из списка. Здесь7245=7245— всегда истина (1), поэтому возвращается первый элемент —1. В реальной атаке вместо этого подзапроса подставляется запрос к системным таблицам, например, для извлечения версии СУБД или имён таблиц.-- -— комментарий. Всё, что идёт после него, игнорируется MySQL. Это нужно, чтобы «отрезать» остаток оригинального запроса.
Как это работает на практике
Предположим, на сервере выполняется запрос вида:
SELECT * FROM users WHERE id = '$id';
Если параметр $id не экранируется, злоумышленник может подставить нашу строку. Тогда итоговый запрос станет таким:
SELECT * FROM users WHERE id = '"))) AND EXTRACTVALUE(7245,CONCAT(0x7e,((SELECT (ELT(7245=7245,1)))),0x7e))-- -';
MySQL попытается выполнить EXTRACTVALUE с аргументом, содержащим тильды и результат подзапроса. Поскольку XPath-выражение начинается с ~, это вызовет ошибку вида:
XPATH syntax error: '~1~'
В тексте ошибки мы видим ~1~ — это и есть результат подзапроса. В реальной атаке вместо 1 будет, например, версия MySQL или хеш пароля администратора.
Почему это опасно?
Error-based инъекции — один из самых быстрых способов извлечения данных. Не нужно слепого перебора, как в boolean-based или time-based. Сервер сам «рассказывает» атакующему, что он хочет узнать. С помощью EXTRACTVALUE или аналогичной UPDATEXML можно за несколько запросов вытащить:
- версию СУБД и операционной системы;
- имена баз данных, таблиц и колонок;
- учётные данные пользователей;
- любые другие данные, доступные текущему пользователю MySQL.
Опасность усугубляется тем, что такие инъекции легко автоматизируются. Инструмент sqlmap, например, поддерживает error-based техники «из коробки».
Как защититься?
Главное правило — никогда не подставлять пользовательский ввод в SQL-запрос напрямую. Вот основные меры:
- Параметризованные запросы (prepared statements). Это самый надёжный способ. Данные передаются отдельно от кода запроса, и СУБД не интерпретирует их как SQL.
- Хранимые процедуры. Если они написаны корректно, риск инъекции снижается.
- Экранирование спецсимволов. Например, функция
mysqli_real_escape_string()в PHP. Но этот метод уступает параметризации и требует осторожности. - Ограничение прав пользователя БД. Приложению не нужны права
FILE,PROCESSили доступ к системным таблицам. Принцип наименьших привилегий снижает ущерб. - WAF (Web Application Firewall). Может блокировать известные сигнатуры атак, но не является панацеей.
- Регулярные аудиты и сканирование уязвимостей. Пентесты помогают выявить дыры до того, как их найдут злоумышленники.
Что делать, если вы нашли такую строку в логах?
Если вы обнаружили подобную конструкцию в логах веб-сервера, это может означать, что ваш сайт пытались взломать. Не паникуйте, но проверьте:
- не было ли успешных инъекций (ищите необычные ошибки в логах MySQL);
- актуальны ли обновления CMS и библиотек;
- используются ли параметризованные запросы во всём коде.
Лучше всего провести внеплановый аудит безопасности.
Заключение
Строка ")) AND EXTRACTVALUE(7245,CONCAT(0x7e,((SELECT (ELT(7245=7245,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированный эксплойт для error-based SQL-инъекции в MySQL. Понимание принципов его работы помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: лучшая защита — это параметризованные запросы и внимательное отношение к любому пользовательскому вводу.
Комментарии
—Войдите, чтобы оставить комментарий