Что это за строка?
Строка ') AND EXTRACTVALUE(5716,CONCAT(0x7e,((SELECT (ELT(5716=5716,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Подобные запросы часто встречаются в отчётах об уязвимостях и в учебных материалах по информационной безопасности. Они демонстрируют, как злоумышленник может заставить базу данных выдать скрытую информацию, если веб-приложение недостаточно защищено.
Разбор по частям
Давайте разберём каждый элемент конструкции.
- ') — закрывает ранее открытую скобку и строковый литерал в уязвимом запросе. Это позволяет внедрить собственный SQL-код.
- AND — логический оператор, который добавляет условие к исходному запросу. Если условие истинно, запрос выполняется дальше; если ложно — может вызвать ошибку или изменить поведение.
- EXTRACTVALUE(5716, CONCAT(...)) — функция MySQL, предназначенная для извлечения значения из XML-документа. При передаче некорректного XPath-выражения она генерирует ошибку, содержащую переданную строку. Это и есть механизм вызова ошибки.
- CONCAT(0x7e, ..., 0x7e) — объединяет строки.
0x7e— шестнадцатеричный код символа~(тильда). Тильды используются как маркеры, чтобы облегчить поиск выводимых данных в сообщении об ошибке. - (SELECT (ELT(5716=5716,1))) — подзапрос, возвращающий результат функции
ELT().ELT(N, str1, str2, ...)возвращает строку по номеру N. Здесь5716=5716— всегда истинное условие (1), поэтомуELT(1,1)вернёт1. Это простейшая проверка работоспособности инъекции. В реальных атаках вместо1подставляют подзапрос, извлекающий данные (например, имя пользователя или пароль). - -- - — комментарий в SQL. Всё, что идёт после, игнорируется базой данных. Это позволяет отбросить оставшуюся часть оригинального запроса.
Как работает error-based инъекция
MySQL при неправильном использовании функции EXTRACTVALUE возвращает ошибку вида: XPATH syntax error: '~1~'. Если в качестве аргумента передать результат подзапроса, то в тексте ошибки окажется именно то значение, которое вернул подзапрос. Таким образом, злоумышленник может «прочитать» данные из базы, не имея прямого доступа к ним.
В приведённой строке пока извлекается просто число 1 — это тестовый запрос для проверки, что инъекция возможна. В реальной атаке вместо ELT(5716=5716,1) могло бы быть что-то вроде (SELECT password FROM users LIMIT 1), и тогда в ошибке отобразился бы пароль.
Законно ли это и чем опасно?
Использование таких конструкций без разрешения владельца системы является нарушением закона и преследуется по статье 272 УК РФ («Неправомерный доступ к компьютерной информации»). Однако понимание механизма необходимо специалистам по безопасности для защиты приложений.
Опасность error-based инъекций в том, что они позволяют относительно просто извлекать данные, если приложение выводит сообщения об ошибках базы данных пользователю. Поэтому рекомендуется отключать подробный вывод ошибок в production-окружении и использовать параметризованные запросы.
Как защититься
Основные меры профилактики:
- Использовать подготовленные выражения (prepared statements) с параметрами вместо конкатенации строк в SQL-запросах.
- Экранировать все пользовательские данные, попадающие в запрос.
- Отключить вывод ошибок СУБД в клиентскую часть; логировать их на сервере.
- Применять принцип наименьших привилегий для учётной записи базы данных, используемой веб-приложением.
- Регулярно проводить аудит кода и пентесты.
Заключение
Строка ') AND EXTRACTVALUE(5716,CONCAT(0x7e,((SELECT (ELT(5716=5716,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Она демонстрирует, как с помощью функций EXTRACTVALUE и CONCAT можно вызвать ошибку, содержащую полезную нагрузку. Понимание таких атак помогает разработчикам и администраторам лучше защищать свои системы.
Комментарии
—Войдите, чтобы оставить комментарий