Что это за строка?
Строка " OR EXTRACTVALUE(2000,CONCAT(0x7e,((SELECT (ELT(2000=2000,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции, основанной на ошибках) для СУБД MySQL. Подобные конструкции используются для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер. В данном случае запрос пытается вызвать ошибку, содержащую результат внедрённого подзапроса.
Такие строки часто встречаются в отчётах сканеров уязвимостей, в учебных материалах по информационной безопасности и в логах веб-серверов при попытке атаки. Понимание их структуры помогает разработчикам и администраторам распознавать атаки и правильно настраивать защиту.
Разбор по компонентам
Рассмотрим каждый элемент запроса подробно.
Оператор OR и кавычка
Начальная двойная кавычка " и оператор OR используются для внедрения в исходный SQL-запрос. Злоумышленник предполагает, что приложение подставляет пользовательский ввод в строковый параметр, и пытается разорвать строку, добавив логическое условие. Если исходный запрос был, например, SELECT * FROM users WHERE name = "...", то после подстановки получается условие, которое может быть всегда истинным или ложным в зависимости от результата внедрённой функции.
Функция EXTRACTVALUE()
EXTRACTVALUE(XML_frag, XPath_expr) — встроенная функция MySQL, которая извлекает значение из фрагмента XML по выражению XPath. Если XML-фрагмент некорректен или XPath-выражение не соответствует синтаксису, функция генерирует ошибку. В контексте инъекции эту ошибку заставляют содержать полезные данные.
Функция CONCAT() и шестнадцатеричные литералы
CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы облегчить поиск внедрённых данных в сообщении об ошибке. Например, если злоумышленник хочет извлечь имя пользователя, он может сформировать XPath-выражение, которое вызовет ошибку вида XPATH syntax error: '~root~'.
Подзапрос (SELECT (ELT(2000=2000,1)))
ELT(N, str1, str2, ...) возвращает строку с номером N. В данном случае ELT(2000=2000,1) — это условная конструкция: 2000=2000 всегда истинно (1), поэтому ELT(1,1) вернёт 1. Фактически это заглушка, которая возвращает число 1. В реальной атаке вместо 1 мог бы быть подзапрос, извлекающий данные, например (SELECT password FROM users LIMIT 1). Здесь же демонстрируется шаблон: если условие истинно, вернуть что-то, иначе — ошибка или другое значение.
Комментарий -- -
Два дефиса и пробел (или дефис) обозначают начало комментария в SQL. Всё, что идёт после, игнорируется сервером. Это позволяет отбросить оставшуюся часть оригинального запроса, чтобы синтаксис стал корректным.
Как работает error-based инъекция
Механизм следующий:
- Приложение передаёт пользовательский ввод в SQL-запрос без должной обработки.
- Злоумышленник внедряет вызов функции, которая при определённых условиях генерирует ошибку с текстом, содержащим результат подзапроса.
- Сервер MySQL возвращает сообщение об ошибке клиенту (веб-приложению), и оно может быть отображено на странице или сохранено в логах.
- Атакующий читает это сообщение и получает интересующие данные (имена таблиц, версию СУБД, учётные данные).
В нашем примере EXTRACTVALUE получает на вход XML-фрагмент, собранный через CONCAT. Второй аргумент — XPath-выражение, которое заведомо некорректно, поэтому функция выдаёт ошибку. Если бы в CONCAT подставлялись реальные данные из подзапроса, они бы попали в текст ошибки.
Важно: приведённая конструкция сама по себе не извлекает данные, а служит шаблоном. В реальных атаках вместо ELT(2000=2000,1) может стоять подзапрос, возвращающий конфиденциальную информацию.
Зачем нужны EXTRACTVALUE и подобные функции
MySQL предоставляет несколько функций, которые могут быть использованы для генерации ошибок с внедрёнными данными: EXTRACTVALUE(), UPDATEXML(), GTID_SUBSET() и другие. Они появились в легальных сценариях работы с XML и геоданными, но злоумышленники нашли способ применять их для обхода защиты. Например, UPDATEXML(XML_target, XPath_expr, new_value) также может вызвать ошибку с текстом XPath-выражения.
С выходом MySQL 8.0 некоторые функции были изменены или удалены, что усложнило error-based инъекции, но не устранило их полностью. Разработчикам рекомендуется использовать параметризованные запросы, чтобы исключить возможность подстановки произвольного SQL-кода.
Пример безопасного кода
Чтобы предотвратить подобные атаки, следует применять подготовленные выражения (prepared statements) с привязкой параметров. Например, на PHP с PDO:
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute(['name' => $userInput]);
В этом случае пользовательский ввод передаётся как значение, а не как часть SQL-запроса, поэтому внедрение функций становится невозможным.
Как распознать атаку
В логах веб-сервера или СУБД можно заметить подозрительные строки, содержащие EXTRACTVALUE, CONCAT(0x7e, ELT( и подобные комбинации. Если такие запросы приходят от клиентов, это признак попытки эксплуатации уязвимости. Рекомендуется настроить фильтрацию входящих запросов (WAF) и регулярно проверять код на наличие уязвимостей с помощью статического анализа.
Заключение
Выражение OR EXTRACTVALUE(2000,CONCAT(0x7e,((SELECT (ELT(2000=2000,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции, использующий особенности функций MySQL для вызова ошибки с внедрёнными данными. Понимание таких конструкций необходимо специалистам по безопасности для эффективного противодействия атакам. Основная защита — использование параметризованных запросов и валидация пользовательского ввода.
Комментарии
—Войдите, чтобы оставить комментарий