Что такое SQL-инъекция через EXTRACTVALUE?
SQL-инъекция (SQL Injection) — один из самых распространённых способов атаки на веб-приложения, при котором злоумышленник внедряет вредоносный SQL-код в запросы к базе данных. Существует несколько разновидностей таких атак: union-based, boolean-based, time-based и error-based. Запрос %" OR EXTRACTVALUE(6755,CONCAT(0x7e,((SELECT (ELT(6755=6755,1)))),0x7e))-- - — яркий пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE() в СУБД MySQL.
Error-based инъекции основаны на том, что база данных при возникновении ошибки возвращает её текст в ответе приложения. Если злоумышленник может заставить СУБД сгенерировать ошибку, содержащую полезные данные (например, имя пользователя, версию БД или хеш пароля), эти данные утекают через сообщение об ошибке.
Разбор запроса по частям
Рассмотрим конструкцию детально:
%"— это начало полезной нагрузки. Символ%часто используется как подстановочный знак в LIKE-запросах, а кавычка"предназначена для разрыва строкового литерала в исходном SQL-запросе. Злоумышленник предполагает, что приложение вставляет пользовательский ввод в запрос внутри двойных кавычек. Закрывая кавычку, он получает возможность дописать произвольный SQL-код.OR— логический оператор, который делает всё выражение истинным при определённых условиях. В error-based инъекциях он часто используется для того, чтобы гарантировать выполнение вредоносной функции, даже если исходное условие ложно.EXTRACTVALUE(6755, CONCAT(0x7e, ((SELECT (ELT(6755=6755,1)))), 0x7e))— ключевая часть. ФункцияEXTRACTVALUE()извлекает значение из XML-документа с помощью XPath-выражения. Она принимает два аргумента: фрагмент XML-разметки и XPath-локатор. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой отображается переданный аргумент.6755— первый аргумент. Это не валидный XML, поэтому функция сразу попытается выдать ошибку. Однако суть в том, что второй аргумент содержит подзапрос.CONCAT(0x7e, ((SELECT (ELT(6755=6755,1)))), 0x7e)— конкатенация символа~(0x7e в шестнадцатеричном виде), результата подзапроса и ещё одного~. Символ~используется как маркер, чтобы легко найти извлечённые данные в сообщении об ошибке.SELECT (ELT(6755=6755,1))— подзапрос, возвращающий результат функцииELT().ELT(N, str1, str2, ...)возвращает N-ю строку из списка. Здесь6755=6755— всегда истина (1), поэтомуELT(1, 1)вернёт строку'1'. Это простейшая проверка работоспособности инъекции. В реальной атаке вместо этого подзапроса внедряют конструкцию для извлечения данных, например:SELECT version()илиSELECT user().-- -— комментарий в SQL. Два дефиса и пробел (или дефис) заставляют СУБД игнорировать оставшуюся часть исходного запроса, чтобы не возникло синтаксической ошибки.
Как работает EXTRACTVALUE в error-based инъекциях
Функция EXTRACTVALUE(XML_fragment, XPath_expression) появилась в MySQL 5.1. Она предназначена для работы с XML, но нашла применение в атаках. Если первый аргумент не является корректным XML, MySQL выдаёт ошибку вида:
XPATH syntax error: '~результат~'
Именно этот текст ошибки возвращается в ответе приложения, если оно не подавляет ошибки БД. Злоумышленник помещает в XPath-выражение подзапрос, результат которого нужно извлечь, оборачивая его в символы-маркеры (например, ~). При возникновении ошибки эти данные попадают в сообщение.
Аналогично работает функция UPDATEXML(), также часто используемая в error-based атаках.
Пошаговый пример эксплуатации
Предположим, уязвимый запрос выглядит так:
SELECT * FROM users WHERE name = '$input';
Злоумышленник передаёт в $input строку:
%" OR EXTRACTVALUE(6755,CONCAT(0x7e,((SELECT version())),0x7e))-- -
После подстановки получается:
SELECT * FROM users WHERE name = '%" OR EXTRACTVALUE(6755,CONCAT(0x7e,((SELECT version())),0x7e))-- -';
СУБД выполняет подзапрос SELECT version(), получает, например, 8.0.32, затем пытается вычислить EXTRACTVALUE(6755, '~8.0.32~'). Поскольку 6755 — не XML, возникает ошибка:
XPATH syntax error: '~8.0.32~'
Эта ошибка возвращается пользователю, и атакующий узнаёт версию MySQL. Аналогично можно извлечь имена таблиц, столбцов, логины и пароли.
Опасность и последствия
Error-based SQL-инъекции через EXTRACTVALUE позволяют злоумышленнику:
- Получить информацию о структуре базы данных (имена таблиц, столбцов).
- Извлечь конфиденциальные данные: учётные записи, хеши паролей, персональные данные пользователей.
- При наличии соответствующих привилегий — читать и записывать файлы на сервере, выполнять команды ОС.
- Обойти аутентификацию и получить доступ к административной панели.
Как защититься от SQL-инъекций
Основной метод защиты — использование параметризованных запросов (prepared statements) с привязкой параметров. Это исключает возможность внедрения SQL-кода, так как пользовательский ввод передаётся отдельно от текста запроса.
Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string()(для MySQL). - Валидация и фильтрация входных данных по белому списку.
- Ограничение прав пользователя БД: приложение должно работать с минимально необходимыми привилегиями.
- Отключение вывода подробных ошибок БД в production-окружении.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Регулярное обновление СУБД и фреймворков.
Заключение
Запрос %" OR EXTRACTVALUE(6755,CONCAT(0x7e,((SELECT (ELT(6755=6755,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции, демонстрирующий уязвимость приложений, которые не фильтруют пользовательский ввод и выводят ошибки базы данных. Понимание таких атак помогает разработчикам и специалистам по безопасности правильно выстраивать защиту. Помните: безопасность — это процесс, а не одноразовое действие.
Комментарии
—Войдите, чтобы оставить комментарий