Что это за запрос
Перед нами фрагмент, который часто встречается в атаках на веб-приложения: ")) AND EXTRACTVALUE(6535,CONCAT(0x7e,((SELECT (ELT(6535=6535,1)))),0x7e))-- -. Это классический пример SQL-инъекции (SQL injection) на основе ошибок (error-based). Злоумышленник пытается внедрить свой код в SQL-запрос, который выполняется на сервере базы данных, чтобы получить информацию или обойти аутентификацию.
В данном случае используются функции MySQL: EXTRACTVALUE и ELT. Запрос сконструирован так, чтобы вызвать ошибку, в тексте которой будут содержаться нужные злоумышленнику данные. Давайте разберём каждый элемент.
Синтаксис и назначение функций
EXTRACTVALUE
EXTRACTVALUE(XML_frag, XPath_expr) — функция MySQL, которая извлекает значение из XML-фрагмента по выражению XPath. Если XML-фрагмент некорректен или XPath-выражение не соответствует синтаксису, функция генерирует ошибку. В контексте SQL-инъекции это используется для того, чтобы вывести результат подзапроса в сообщении об ошибке.
ELT
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В нашем payload: ELT(6535=6535,1). Выражение 6535=6535 всегда истинно (1), поэтому ELT возвращает первый элемент — строку '1'. Это простой способ получить константу, но в реальных атаках вместо '1' может быть подзапрос, извлекающий данные (например, имя пользователя или пароль).
CONCAT и 0x7e
CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы облегчить поиск извлечённых данных в тексте ошибки. Часто в error-based инъекциях применяют именно такой приём: оборачивают полезную нагрузку в символы, которые легко заметить.
Как работает внедрение
Предположим, исходный запрос выглядит так: SELECT * FROM users WHERE id = '" + input + "'. Злоумышленник подставляет свою строку. В нашем случае payload начинается с ")) — это попытка закрыть скобки и кавычки, чтобы разорвать оригинальный запрос и добавить условие AND EXTRACTVALUE(...). Затем следует комментарий -- -, который «съедает» оставшуюся часть исходного запроса.
В результате сервер выполняет что-то вроде:
SELECT * FROM users WHERE id = '")) AND EXTRACTVALUE(6535,CONCAT(0x7e,((SELECT (ELT(6535=6535,1)))),0x7e))-- -'
Функция EXTRACTVALUE получает первым аргументом число 6535 (некорректный XML), а вторым — строку, начинающуюся с тильды. Так как первый аргумент не является XML-документом, MySQL выдаёт ошибку, в тексте которой будет второй аргумент, то есть ~1~. Если бы вместо ELT(6535=6535,1) стоял подзапрос, например (SELECT password FROM users LIMIT 1), то в ошибке отобразился бы пароль.
Зачем это нужно злоумышленнику
Цель — получить данные из базы, используя сообщения об ошибках, когда другие методы (UNION, blind) недоступны. Error-based инъекция позволяет за один запрос извлечь небольшую порцию информации. В нашем примере payload демонстрационный: он не извлекает реальные данные, а лишь показывает работоспособность техники (если ответ сервера содержит ошибку с «~1~», значит, инъекция возможна).
Меры защиты
- Параметризованные запросы (prepared statements) — главный способ предотвращения SQL-инъекций. Они отделяют код от данных.
- Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером базы данных (например,
mysqli_real_escape_stringв PHP), но это менее надёжно, чем параметризация. - Валидация и фильтрация входных данных — проверяйте типы, форматы, ограничивайте длину.
- Минимальные привилегии для учётной записи БД — не давайте приложению прав на чтение системных таблиц и выполнение опасных функций.
- Отключение подробных сообщений об ошибках на production-серверах, чтобы не давать злоумышленнику информацию.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
Важно: даже если вы не используете MySQL, аналогичные техники существуют и для других СУБД. Универсальная защита — параметризация запросов и строгая валидация.
Вывод
Payload ")) AND EXTRACTVALUE(6535,CONCAT(0x7e,((SELECT (ELT(6535=6535,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Он показывает, как злоумышленники комбинируют функции EXTRACTVALUE, ELT и CONCAT с символом ~ для извлечения данных через сообщения об ошибках. Понимание механики таких атак помогает разработчикам правильно защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий