Что это за строка?
Строка %')))) AND EXTRACTVALUE(5693,CONCAT(0x7e,((SELECT (ELT(5693=5693,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL. Если вы увидели её в своих логах — это попытка взлома или сканирования вашего сайта. Если вы разработчик и нашли её в коде — возможно, ваше приложение уязвимо.
Разбор по частям
Давайте разберём каждый элемент этой конструкции.
1. %'))))
Этот фрагмент — попытка «закрыть» предыдущие SQL-выражения и выйти за пределы ожидаемого контекста. Символ % часто используется как подстановочный знак в LIKE-запросах. Далее идут закрывающие кавычка и скобки: ')))). Злоумышленник предполагает, что в исходном запросе уже есть открытые скобки и кавычки, и пытается их закрыть, чтобы вставить свой код.
2. AND EXTRACTVALUE(5693, CONCAT(...))
EXTRACTVALUE — это функция MySQL для работы с XML. Она извлекает значение из XML-фрагмента по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(xml_frag, xpath_expr). Если XPath-выражение некорректно, функция генерирует ошибку, в тексте которой может содержаться переданный фрагмент.
В нашем случае первый аргумент — 5693 (произвольное число), второй — результат CONCAT.
3. CONCAT(0x7e, ((SELECT (ELT(5693=5693,1)))), 0x7e)
CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Он используется как разделитель, чтобы облегчить поиск данных в сообщении об ошибке.
Внутри — подзапрос SELECT (ELT(5693=5693,1)). ELT — функция MySQL, возвращающая N-й элемент из списка. Здесь ELT(5693=5693,1): условие 5693=5693 всегда истинно (возвращает 1), поэтому ELT вернёт первый элемент — число 1. Это простейшая проверка, что инъекция выполняется. В реальной атаке вместо 1 могло бы быть имя базы данных, таблицы или хеш пароля.
4. -- -
Это комментарий в SQL. Два дефиса с пробелом (или -- ) означают, что весь оставшийся код запроса игнорируется. Это позволяет злоумышленнику «отрезать» лишнюю часть оригинального запроса, чтобы синтаксис оставался корректным.
Как работает error-based инъекция?
MySQL при неправильном XPath-выражении в EXTRACTVALUE выдаёт ошибку вида:
XPATH syntax error: '~1~'
Злоумышленник может подставить вместо 1 любой другой запрос, например (SELECT version()), и в тексте ошибки увидеть версию СУБД. Пошагово извлекая данные через такие ошибки, атакующий может получить имена таблиц, столбцов и даже содержимое базы.
Это один из самых простых и эффективных методов, если приложение выводит ошибки СУБД на экран. Даже если ошибки не показываются, они могут попадать в логи, к которым у злоумышленника может быть доступ.
Чем опасна такая инъекция?
- Утечка данных: злоумышленник может читать любые таблицы, к которым имеет доступ пользователь БД.
- Обход аутентификации: с помощью инъекции можно войти в систему без пароля.
- Изменение или удаление данных: в зависимости от прав, можно выполнять UPDATE, DELETE, DROP.
- Компрометация сервера: в некоторых случаях через SQL-инъекцию можно выполнить команды ОС.
Как защититься?
- Используйте подготовленные выражения (prepared statements) с параметризацией. Это самый надёжный способ.
- Экранируйте специальные символы при динамическом построении запросов (но это менее надёжно).
- Ограничьте права пользователя БД: не давайте приложению прав на DROP, FILE и т.п.
- Отключите вывод ошибок СУБД в production. Ошибки должны логироваться, но не показываться пользователю.
- Используйте WAF (Web Application Firewall) для фильтрации подозрительных запросов.
- Регулярно обновляйте СУБД и фреймворки.
Что делать, если вы нашли такую строку в логах?
Это признак того, что ваш сайт сканируют на уязвимости. Если вы не используете MySQL или не выводите ошибки, скорее всего, атака не удалась. Но стоит проверить:
- Нет ли в приложении динамических SQL-запросов без параметризации.
- Не отображаются ли ошибки БД пользователям.
- Не было ли успешных попыток эксплуатации (например, странных запросов к БД).
Рекомендуется провести аудит кода и настроек безопасности.
Заключение
Строка %')))) AND EXTRACTVALUE(5693,CONCAT(0x7e,((SELECT (ELT(5693=5693,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка SQL-инъекции через функцию EXTRACTVALUE. Понимание механики таких атак помогает разработчикам и администраторам лучше защищать свои системы. Никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.
Комментарии
—Войдите, чтобы оставить комментарий