Что такое AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- -?
Строка ) AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных через сообщения об ошибках, которые возвращает сервер.
В данной статье мы подробно разберём, как работает этот запрос, какие функции MySQL задействованы, и главное — как защитить своё веб-приложение от подобных атак.
Разбор составляющих запроса
Давайте разложим строку на компоненты, чтобы понять её назначение.
1. AND
Логический оператор AND используется для добавления условия к существующему SQL-запросу. Злоумышленник предполагает, что исходный запрос имеет конструкцию вида SELECT ... WHERE id = '$input'. Подставляя AND ..., он пытается выполнить дополнительное выражение, результат которого повлияет на ответ сервера.
2. EXTRACTVALUE(8393, CONCAT(...))
Функция EXTRACTVALUE в MySQL предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_document, XPath_expression). Однако при неправильном XPath-выражении функция генерирует ошибку, которая содержит переданный фрагмент. Этим и пользуются атакующие.
В нашем случае первым аргументом идёт число 8393 — это просто произвольное число, которое не является корректным XML-документом. Второй аргумент — результат CONCAT.
3. CONCAT(0x7e, ((SELECT (ELT(8393=8393,1)))), 0x7e)
Функция CONCAT объединяет строки. Здесь:
0x7e— шестнадцатеричное представление символа~(тильда). Он используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.((SELECT (ELT(8393=8393,1))))— подзапрос, который возвращает результат функцииELT.- Второй
0x7e— закрывающая тильда.
4. ELT(8393=8393,1)
Функция ELT возвращает N-й элемент из списка строк: ELT(N, str1, str2, ...). Если N=1, возвращается первая строка. Здесь 8393=8393 — это логическое выражение, которое всегда истинно (1). Таким образом, ELT(1,1) вернёт строку '1'. Это простейший пример; в реальных атаках вместо 1 может быть подзапрос, извлекающий данные (например, версию СУБД, имена таблиц и т.д.).
5. -- -
Комментарий -- - (дефис-дефис-пробел-дефис) используется для «обрезки» оставшейся части оригинального SQL-запроса. В MySQL комментарий начинается с -- (два дефиса и пробел) и продолжается до конца строки. Добавление дефиса после пробела — распространённый приём, чтобы гарантировать, что комментарий не будет проигнорирован из-за отсутствия пробела.
Как работает атака
Предположим, что на сайте есть страница с параметром id, и уязвимый запрос выглядит так:
SELECT * FROM articles WHERE id = '$id'
Злоумышленник передаёт в параметр id значение:
1' AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- -
После подстановки запрос принимает вид:
SELECT * FROM articles WHERE id = '1' AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- -'
MySQL выполняет EXTRACTVALUE с некорректным XPath, и возвращает ошибку примерно такого содержания:
XPATH syntax error: '~1~'
В сообщении об ошибке отображается результат подзапроса, обёрнутый в тильды. Если вместо 1 использовать, например, (SELECT version()), то в ошибке появится версия MySQL. Так пошагово атакующий может извлечь любые данные: имена таблиц, столбцов, логины и пароли пользователей.
Почему это опасно?
Error-based SQL-инъекции позволяют злоумышленнику:
- Получить полный доступ к базе данных, включая конфиденциальную информацию.
- Обойти аутентификацию и авторизацию.
- Изменить или удалить данные.
- В некоторых случаях — выполнить произвольные команды на сервере.
Даже если приложение не выводит ошибки напрямую, атакующий может использовать слепые методы, но error-based считается наиболее быстрым и удобным для эксплуатации.
Как защититься от SQL-инъекций?
Основной метод защиты — использование параметризованных запросов (prepared statements) с привязкой параметров. Это исключает возможность внедрения SQL-кода, так как данные передаются отдельно от самого запроса.
Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string(но это менее надёжно, чем prepared statements). - Валидация и фильтрация входных данных — проверяйте, что параметры соответствуют ожидаемому типу (число, строка и т.д.).
- Ограничение прав пользователя БД — не используйте учётную запись с правами администратора для работы приложения.
- Отключение вывода подробных ошибок на продакшене — это затруднит эксплуатацию error-based инъекций.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Регулярное обновление СУБД и фреймворков — чтобы закрыть известные уязвимости.
Заключение
Конструкция AND EXTRACTVALUE(8393,CONCAT(0x7e,((SELECT (ELT(8393=8393,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции для MySQL. Она демонстрирует, как злоумышленники используют функции EXTRACTVALUE, CONCAT и ELT для извлечения данных через сообщения об ошибках. Понимание механизма таких атак помогает разработчикам и администраторам своевременно принимать меры защиты. Всегда используйте параметризованные запросы и следуйте лучшим практикам безопасности.
Комментарии
—Войдите, чтобы оставить комментарий