Что это за строка и откуда она берётся?
Встречая в логах веб-сервера или в поле ввода подобную конструкцию:
))) AND EXTRACTVALUE(2589,CONCAT(0x7e,((SELECT (ELT(2589=2589,1)))),0x7e))-- -
многие задаются вопросом: что это и какова её цель? Это классический пример SQL-инъекции, нацеленной на извлечение данных из базы через генерацию ошибок. Подобные строки часто появляются при сканировании уязвимостей или при попытке эксплуатации плохо защищённых форм на сайте.
Сам запрос состоит из нескольких частей, каждая из которых выполняет свою роль. Разберём его по частям.
Анатомия инъекции
Начнём с начала строки: ))) — это попытка закрыть лишние скобки, которые могли остаться от оригинального SQL-запроса, построенного разработчиком. Злоумышленник предполагает, что приложение подставляет пользовательский ввод в запрос, не экранируя его, и пытается «сбалансировать» синтаксис.
Далее идёт AND EXTRACTVALUE(2589,CONCAT(0x7e,((SELECT (ELT(2589=2589,1)))),0x7e)). Это сердце атаки. Функция EXTRACTVALUE в MySQL предназначена для извлечения значения из XML-документа по указанному XPath-выражению. Однако при передаче некорректного XPath она вызывает ошибку, в текст которой попадает переданное выражение. Именно этим и пользуются хакеры: они заставляют базу данных вывести в сообщении об ошибке результат подзапроса.
В нашем случае вторым аргументом EXTRACTVALUE является CONCAT(0x7e, ((SELECT (ELT(2589=2589,1)))), 0x7e). Функция CONCAT склеивает три части: символ с кодом 0x7e (это тильда ~), результат подзапроса и снова тильду. Тильда используется как маркер, чтобы потом легко найти выведенные данные в тексте ошибки.
Подзапрос SELECT (ELT(2589=2589,1)) возвращает 1, так как условие 2589=2589 всегда истинно, а функция ELT с истинным первым аргументом возвращает второй аргумент — число 1. В реальной атаке вместо этой простой проверки стоял бы запрос к таблицам базы данных, например, извлечение имени пользователя или хеша пароля.
Завершает строку -- - — это комментарий в SQL, который отсекает всё, что могло идти после инъекции в исходном запросе. Пробел после двух дефисов обязателен в некоторых СУБД, поэтому часто пишут -- - или --+.
Как работает атака на практике
Представим, что на сайте есть страница с параметром id, и разработчик формирует запрос так:
SELECT * FROM products WHERE id = '$id'
Если пользователь передаст в параметр id значение 1' AND EXTRACTVALUE(...)-- -, то итоговый запрос станет таким:
SELECT * FROM products WHERE id = '1' AND EXTRACTVALUE(2589,CONCAT(0x7e,((SELECT (ELT(2589=2589,1)))),0x7e))-- -'
База данных выполнит запрос, дойдёт до EXTRACTVALUE, та выдаст ошибку вида:
XPATH syntax error: '~1~'
Злоумышленник видит в ответе сервера это сообщение и понимает, что инъекция работает, а также получает возможность извлекать произвольные данные, подставляя вместо ELT(2589=2589,1) другие подзапросы.
Почему это опасно?
SQL-инъекции остаются одной из самых распространённых уязвимостей веб-приложений. По данным OWASP, они входят в топ-10 критических рисков. С помощью подобных техник злоумышленник может:
- получить доступ к конфиденциальным данным (логины, пароли, персональная информация);
- изменить или удалить содержимое базы данных;
- выполнить произвольные команды на сервере в некоторых конфигурациях;
- использовать сервер для дальнейших атак.
Особенно опасны слепые инъекции, когда данные извлекаются побитно через логические условия, но в нашем примере используется error-based метод, который даёт быстрый результат, если приложение выводит ошибки СУБД пользователю.
Как защититься?
Главный способ защиты — использовать параметризованные запросы (prepared statements). В этом случае пользовательский ввод передаётся отдельно от SQL-кода и не может изменить структуру запроса. Например, в PHP с PDO это делается так:
$stmt = $pdo->prepare('SELECT * FROM products WHERE id = :id');
$stmt->execute(['id' => $id]);
Дополнительные меры:
- экранирование специальных символов с помощью функций типа
mysqli_real_escape_string(но это не панацея); - ограничение прав пользователя базы данных: приложение должно работать под учёткой с минимально необходимыми привилегиями;
- отключение вывода подробных ошибок СУБД в production-окружении;
- использование WAF (Web Application Firewall) для фильтрации подозрительных запросов;
- регулярное обновление СУБД и фреймворков.
Что делать, если вы нашли такую строку в логах?
Если вы администратор сайта и обнаружили подобные записи в логах, это может означать, что ваш сайт пытались взломать. Не паникуйте, но проверьте:
- Есть ли на сайте формы, принимающие пользовательский ввод, и как они обрабатываются.
- Используются ли параметризованные запросы.
- Не было ли успешных попыток инъекции (ищите необычные ошибки в логах СУБД).
- Обновите CMS и плагины до последних версий.
Если вы не уверены в безопасности своего кода, лучше обратиться к специалистам по информационной безопасности.
Заключение
Строка ))) AND EXTRACTVALUE(2589,CONCAT(0x7e,((SELECT (ELT(2589=2589,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированный эксплойт для проверки и эксплуатации SQL-инъекции через ошибки. Понимание принципов его работы помогает разработчикам и администраторам лучше защищать свои веб-приложения.
Помните: безопасность — это процесс, а не одноразовое действие. Используйте проверенные практики, следите за обновлениями и проводите аудит кода.
Комментарии
—Войдите, чтобы оставить комментарий