Что это за строка?
Строка `) AND EXTRACTVALUE(5431,CONCAT(0x7e,((SELECT (ELT(5431=5431,1)))),0x7e))-- - — это пример SQL-инъекции, а точнее — инъекции, основанной на ошибках (error-based SQL injection). Подобные конструкции часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Они не являются случайным набором символов, а представляют собой осмысленный запрос, цель которого — заставить базу данных вернуть определённую информацию через сообщение об ошибке.
В данной статье мы разберём каждый элемент этой строки, объясним, как она работает, и покажем, почему она опасна для веб-приложений, не защищённых от SQL-инъекций.
Разбор по частям
Начнём с начала строки:
`)— закрывающая круглая скобка и обратный апостроф. В SQL обратный апостроф (backtick) используется для экранирования идентификаторов (имён таблиц, столбцов). Закрывающая скобка завершает ранее открытую конструкцию в оригинальном запросе. Это позволяет «вырваться» из контекста исходного SQL-запроса и добавить свои условия.AND— логический оператор, который добавляет условие к запросу. Чтобы инъекция сработала, исходный запрос должен быть истинным, а добавленное условие — выполнимым.EXTRACTVALUE(5431, CONCAT(0x7e, ((SELECT (ELT(5431=5431,1)))), 0x7e))— вызов функции EXTRACTVALUE. Эта функция в MySQL (и MariaDB) предназначена для извлечения значения из XML-документа по XPath-выражению. Однако при неправильном использовании она генерирует ошибку, которая выводится в ответе сервера.-- -— комментарий. В MySQL символы--начинают комментарий до конца строки, а пробел после них (или дефис в данном случае) обязателен для корректного распознавания. Это позволяет отбросить остаток оригинального запроса.
Как работает EXTRACTVALUE в этой инъекции?
Функция EXTRACTVALUE(XML, XPath) принимает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно или возвращает не то, что ожидается, MySQL выдаёт ошибку. В контексте SQL-инъекции злоумышленник намеренно вызывает такую ошибку, чтобы в тексте ошибки отобразились данные, полученные из подзапроса.
В нашем случае вторым аргументом идёт CONCAT(0x7e, ((SELECT (ELT(5431=5431,1)))), 0x7e). Функция CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.
Что делает ELT(5431=5431,1)?
Выражение ELT(5431=5431,1) — это функция ELT (от англ. element), которая возвращает N-й элемент из списка. Первый аргумент — 5431=5431 — это логическое выражение, которое всегда истинно (1). Второй аргумент — 1. Таким образом, ELT(1,1) вернёт первый элемент списка, то есть 1. Это простейший случай, демонстрирующий работу инъекции. В реальной атаке вместо 1 мог бы стоять подзапрос, возвращающий имя пользователя, пароль или другую конфиденциальную информацию.
Итак, CONCAT(0x7e, 1, 0x7e) вернёт строку ~1~.
Почему возникает ошибка?
Функция EXTRACTVALUE ожидает, что второй аргумент будет корректным XPath-выражением. Строка ~1~ не является валидным XPath. Поэтому MySQL генерирует ошибку вида: XPATH syntax error: '~1~'. В этой ошибке и содержится результат выполнения подзапроса — в данном случае просто 1. Если бы вместо 1 был подзапрос, возвращающий, например, версию базы данных, то в ошибке отобразилась бы эта версия.
Зачем это нужно злоумышленнику?
Основная цель — получить информацию о базе данных, которую невозможно извлечь обычными средствами. Error-based инъекции позволяют:
- Определить версию СУБД.
- Получить имена таблиц и столбцов.
- Извлечь логины и пароли пользователей.
- Читать произвольные данные из базы.
В данном примере строка с ELT(5431=5431,1) — это, скорее, тестовая проверка уязвимости. Если сервер возвращает ошибку с ~1~, значит, приложение уязвимо и можно переходить к более сложным запросам.
Как защититься?
Лучший способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому введённые пользователем строки никогда не интерпретируются как SQL-код. Дополнительные меры:
- Экранирование специальных символов.
- Ограничение прав пользователя базы данных (принцип наименьших привилегий).
- Отключение вывода подробных ошибок в production-окружении.
- Использование WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Важно: даже если ошибка не выводится пользователю, она может быть записана в логи, где злоумышленник сможет её прочитать при наличии доступа.
Заключение
Строка `) AND EXTRACTVALUE(5431,CONCAT(0x7e,((SELECT (ELT(5431=5431,1)))),0x7e))-- - — это компактный пример error-based SQL-инъекции. Она использует особенности функций EXTRACTVALUE и ELT для вызова ошибки, содержащей результат подзапроса. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий