Что такое EXTRACTVALUE и почему она в строке запроса?
Строка ')) AND EXTRACTVALUE(6429,CONCAT(0x7e,((SELECT (ELT(6429=6429,1)))),0x7e))-- - — это не случайный набор символов, а хорошо известный шаблон SQL-инъекции, нацеленный на базу данных MySQL. Такие конструкции часто встречаются в логах веб-серверов, в полях ввода форм и в параметрах URL. Их основная цель — заставить сервер выполнить произвольный SQL-код и вернуть данные, которые в нормальных условиях скрыты.
Функция EXTRACTVALUE в MySQL предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Однако при передаче в неё некорректного XPath она генерирует ошибку, текст которой содержит переданные данные. Именно это свойство злоумышленники используют для так называемых error-based SQL-инъекций: они намеренно вызывают ошибку, чтобы в её сообщении увидеть результат выполнения подзапроса.
Как работает конкретная инъекция
Разберём строку по частям:
'))— закрывающие скобки и кавычки, которые «ломают» оригинальный SQL-запрос, делая его синтаксически корректным для внедрения. Количество скобок подбирается экспериментально в зависимости от структуры уязвимого запроса.AND EXTRACTVALUE(6429, CONCAT(0x7e, ((SELECT (ELT(6429=6429,1)))), 0x7e))— вызов функции EXTRACTVALUE. Первый аргумент (6429) — произвольное число, второй — XPath-выражение, собранное через CONCAT.0x7e— шестнадцатеричное представление символа~(тильда). Он используется как разделитель, чтобы в сообщении об ошибке чётко выделить возвращаемое значение.ELT(6429=6429,1)— функция ELT возвращает N-й элемент из списка. Выражение6429=6429всегда истинно (1), поэтому ELT(1,1) вернёт «1». Это простейшая проверка, которая в реальных атаках заменяется на подзапрос, извлекающий данные (например, версию СУБД, имена таблиц или пароли).-- -— комментарий, который «отрезает» оставшуюся часть оригинального запроса, чтобы не возникло синтаксических ошибок.
В результате MySQL пытается выполнить EXTRACTVALUE с XPath-выражением, начинающимся с символа ~, что недопустимо. СУБД возвращает ошибку вида: XPATH syntax error: '~1~'. В этом сообщении и содержится результат подзапроса. Атакующий, получая такие ошибки, может посимвольно извлекать любые данные из базы.
Зачем это нужно злоумышленнику
Основная цель — получение конфиденциальной информации:
- Версия MySQL, имя текущей базы данных, пользователь.
- Список таблиц и колонок (через information_schema).
- Содержимое таблиц: логины, пароли, персональные данные, номера карт.
- В некоторых случаях — выполнение произвольных команд на сервере, если у пользователя БД есть соответствующие привилегии.
Error-based инъекции особенно опасны тем, что не требуют вывода данных на страницу — достаточно, чтобы сообщение об ошибке отображалось пользователю или попадало в логи, к которым у атакующего есть доступ.
Пример реального использования
Предположим, на сайте есть скрипт, выполняющий запрос:
SELECT * FROM articles WHERE id = '$id'
Если параметр $id не фильтруется, злоумышленник может передать:
1')) AND EXTRACTVALUE(6429,CONCAT(0x7e,(SELECT version()),0x7e))-- -
Тогда итоговый запрос станет:
SELECT * FROM articles WHERE id = '1')) AND EXTRACTVALUE(6429,CONCAT(0x7e,(SELECT version()),0x7e))-- -'
СУБД выполнит подзапрос, получит версию и попытается вставить её в XPath, вызвав ошибку с текстом, содержащим версию. Так атакующий узнает, например, «8.0.32».
Как защититься от таких атак
Надёжная защита строится на комплексном подходе:
- Параметризованные запросы (prepared statements). Это самый эффективный метод. Данные передаются отдельно от SQL-кода, и СУБД не интерпретирует их как часть запроса.
- Экранирование специальных символов. Если по каким-то причинам нельзя использовать подготовленные выражения, необходимо применять функции экранирования, например
mysqli_real_escape_string. - Валидация входных данных. Проверяйте, что параметры соответствуют ожидаемому типу (число, дата, email) и не содержат подозрительных конструкций.
- Отключение вывода ошибок СУБД. Сообщения об ошибках не должны показываться пользователю; их следует логировать, но не отображать.
- Использование ORM. Современные ORM (например, Doctrine, Hibernate) по умолчанию используют параметризацию.
- Регулярные обновления. Устаревшие версии MySQL могут иметь дополнительные уязвимости.
Также рекомендуется использовать веб-application firewall (WAF), который может блокировать известные шаблоны инъекций, но полагаться только на него нельзя.
Что делать, если вы нашли такую строку в логах
Если вы обнаружили подобную запись в логах своего сайта, это может означать, что его пытались взломать. Необходимо:
- Проверить, не была ли атака успешной (поискать необычные запросы к БД, изменения в данных).
- Убедиться, что все точки входа (формы, API, параметры URL) защищены.
- Провести аудит кода на предмет наличия уязвимостей.
- Обновить CMS и библиотеки до актуальных версий.
- Настроить мониторинг и оповещения о подозрительной активности.
В большинстве случаев такие строки — это автоматизированные сканеры уязвимостей, которые прощупывают сайты на наличие дыр. Но если приложение уязвимо, за сканером может прийти и реальный взломщик.
Заключение
Конструкция ')) AND EXTRACTVALUE(6429,CONCAT(0x7e,((SELECT (ELT(6429=6429,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Понимание механики таких атак помогает разработчикам и администраторам лучше защищать свои веб-приложения. Главное правило: никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.
Комментарии
—Войдите, чтобы оставить комментарий