Что это за строка?
Строка '))) AND EXTRACTVALUE(9029,CONCAT(0x7e,((SELECT (ELT(9029=9029,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто используются пентестерами и злоумышленниками для получения информации о структуре базы данных, версии СУБД или содержимого таблиц.
В основе лежит функция EXTRACTVALUE, которая извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой может отображаться переданный аргумент. Это позволяет злоумышленнику «вытащить» нужные данные через сообщение об ошибке.
Разбор компонентов инъекции
Рассмотрим строку по частям:
')))— закрывающие кавычка и скобки, которые завершают предыдущий SQL-запрос, чтобы внедрить собственный код.AND EXTRACTVALUE(9029,CONCAT(0x7e,((SELECT (ELT(9029=9029,1)))),0x7e))— вызов функции EXTRACTVALUE с двумя аргументами: первый — произвольное число 9029, второй — конкатенация тильды (0x7e), результата подзапроса и ещё одной тильды.-- -— комментарий, который игнорирует оставшуюся часть оригинального запроса.
Внутри EXTRACTVALUE выполняется подзапрос SELECT (ELT(9029=9029,1)). Функция ELT возвращает N-й элемент из списка. Здесь условие 9029=9029 всегда истинно, поэтому ELT возвращает 1. Это простейший случай, демонстрирующий работу инъекции. В реальной атаке вместо 1 мог бы быть, например, version() или database().
Как работает EXTRACTVALUE
Функция EXTRACTVALUE была добавлена в MySQL 5.1.5 и предназначена для работы с XML. Синтаксис: EXTRACTVALUE(XML_frag, XPath_expr). Она возвращает текст первого текстового узла, соответствующего XPath-выражению. Если XPath содержит ошибку, MySQL выдаёт ошибку вида:
XPATH syntax error: '~1~'
Именно этот механизм и эксплуатируется: злоумышленник формирует XPath так, чтобы в сообщении об ошибке появились данные, полученные из подзапроса. Например, если вместо 1 подставить version(), ошибка покажет версию MySQL.
Пошаговое выполнение
- Приложение получает от пользователя строку, содержащую вредоносный код, и подставляет её в SQL-запрос без должной обработки.
- СУБД выполняет запрос, включая внедрённый фрагмент.
- Функция EXTRACTVALUE пытается разобрать XPath-выражение, которое содержит результат подзапроса, обёрнутый в тильды.
- Возникает ошибка синтаксиса XPath, и MySQL возвращает сообщение, содержащее этот результат.
- Злоумышленник видит данные в ответе сервера (или в логах) и может продолжать извлекать информацию по частям.
Зачем нужны тильды (0x7e)?
Тильды используются как маркеры, чтобы отделить извлекаемые данные от остального текста ошибки. Это упрощает автоматический парсинг результата. Часто вместо тильд применяют другие символы, например, двоеточие или звёздочку. Главное — чтобы символ не встречался в самих данных.
Опасность error-based инъекций
Error-based SQL-инъекции считаются одними из самых удобных для атакующего, так как не требуют слепого перебора. Сервер сам возвращает данные в сообщении об ошибке. Это позволяет быстро получить:
- версию СУБД;
- имя текущей базы данных;
- список таблиц и колонок;
- учётные записи пользователей;
- конфиденциальные данные (пароли, токены, персональную информацию).
Особенно опасны такие инъекции в веб-приложениях, где вывод ошибок не отключён. Даже если ошибка не показывается пользователю, она может попасть в логи, к которым у злоумышленника есть доступ.
Как защититься
Основной способ предотвращения — использование параметризованных запросов (prepared statements). Это гарантирует, что пользовательский ввод никогда не будет интерпретирован как SQL-код. Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string. - Отключение вывода подробных ошибок СУБД в production-среде.
- Ограничение прав пользователя базы данных: приложение должно работать с минимально необходимыми привилегиями.
- Регулярное обновление MySQL, так как в новых версиях функция EXTRACTVALUE может быть удалена или изменена (в MySQL 8.0 она признана устаревшей).
- Использование WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Важно понимать, что простая фильтрация кавычек не всегда эффективна. Например, в некоторых кодировках можно обойти экранирование. Поэтому лучшая практика — параметризация.
Пример безопасного кода на PHP
Вместо конкатенации строк используйте подготовленные выражения:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);
Такой подход полностью исключает возможность SQL-инъекции, даже если злоумышленник передаст строку с EXTRACTVALUE.
Заключение
Строка '))) AND EXTRACTVALUE(9029,CONCAT(0x7e,((SELECT (ELT(9029=9029,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Она демонстрирует, как через функцию EXTRACTVALUE можно извлечь данные из базы, используя сообщения об ошибках. Понимание таких атак помогает разработчикам и администраторам лучше защищать свои системы. Всегда используйте параметризованные запросы, минимизируйте привилегии и не показывайте ошибки СУБД конечным пользователям.
Комментарии
—Войдите, чтобы оставить комментарий