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