Что это за строка?
Строка "))) AND EXTRACTVALUE(2131,CONCAT(0x7e,((SELECT (ELT(2131=2131,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы данных через вывод сообщений об ошибках. Подобные строки часто появляются в логах веб-сервера, в полях ввода форм или в параметрах URL, когда злоумышленник пытается проэксплуатировать уязвимость.
Внешне это выглядит как бессмысленный набор символов, но на самом деле это тщательно сконструированный запрос, который заставляет базу данных выдать скрытую информацию. Давайте разберём его по частям.
Анатомия инъекции: пошаговый разбор
Рассмотрим каждый элемент строки:
")))— последовательность закрывающих кавычек и скобок. Она нужна, чтобы «закрыть» ранее открытые конструкции в оригинальном SQL-запросе и подготовить почву для внедрения своего кода. Точное количество символов подбирается экспериментально в зависимости от контекста.AND— логический оператор, который добавляет наше условие к исходному запросу. Если исходный запрос возвращал какие-то данные, то сANDмы можем влиять на результат.EXTRACTVALUE(2131, CONCAT(...))— это ключевая функция. EXTRACTVALUE извлекает значение из XML-фрагмента. Она принимает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой отображается переданное значение. Именно это и используется для извлечения данных.2131— произвольное число, которое передаётся как XML-документ (фактически строка '2131'). Оно не несёт смысловой нагрузки, но должно быть допустимым.CONCAT(0x7e, ((SELECT (ELT(2131=2131,1)))), 0x7e)— формирует строку, которая будет вставлена в XPath.0x7e— это шестнадцатеричное представление символа~(тильда). Он используется как разделитель, чтобы облегчить поиск выводимых данных в сообщении об ошибке.(SELECT (ELT(2131=2131,1)))— это подзапрос, который возвращает результат. ELT — функция, возвращающая N-й элемент из списка. ЗдесьELT(2131=2131,1)вернёт1, потому что условие2131=2131истинно (равно 1). В реальной атаке вместо этого подзапроса внедряется запрос к системным таблицам, например, для получения имени базы данных или хеша пароля.-- -— комментарий в SQL. Всё, что идёт после--, игнорируется базой данных. Пробел после дефисов обязателен в некоторых реализациях, а дополнительный дефис часто добавляют для надёжности.
Как это работает на практике
Предположим, есть уязвимый запрос вида:
SELECT * FROM articles WHERE id = '$id';
Если в параметр $id подставить нашу строку, запрос превратится в:
SELECT * FROM articles WHERE id = '"))) AND EXTRACTVALUE(2131,CONCAT(0x7e,((SELECT (ELT(2131=2131,1)))),0x7e))-- -';
После закрытия кавычки и скобок, MySQL выполнит функцию EXTRACTVALUE. Поскольку второй аргумент (XPath) содержит символ ~ и другие данные, не являющиеся корректным XPath-выражением, СУБД сгенерирует ошибку. В тексте ошибки будет отображено переданное значение, например:
XPATH syntax error: '~1~'
Таким образом, атакующий может видеть результат выполнения подзапроса. В данном примере выводится просто 1, но если заменить ELT(2131=2131,1) на (SELECT version()), то в ошибке появится версия MySQL. Это и есть основа error-based инъекции.
Зачем это нужно злоумышленнику?
Цель таких атак — получить доступ к данным, которые не должны быть видны. С помощью error-based SQL-инъекции можно:
- Определить версию СУБД и операционной системы.
- Получить имена таблиц и колонок из системной схемы
information_schema. - Извлечь логины, пароли, номера кредитных карт и другую конфиденциальную информацию.
- В некоторых случаях — выполнить произвольные команды на сервере.
Опасность в том, что для эксплуатации не требуется видеть вывод запроса на экране — достаточно, чтобы сообщения об ошибках отображались пользователю или попадали в логи, к которым есть доступ.
Меры защиты
Чтобы предотвратить подобные атаки, разработчикам следует:
- Использовать подготовленные выражения (prepared statements) с параметризацией запросов. Это самый надёжный способ, так как данные не смешиваются с кодом SQL.
- Отключить вывод ошибок СУБД на продакшене. Сообщения об ошибках должны логироваться, но не показываться пользователю.
- Проводить валидацию и экранирование всех входных данных, особенно тех, что попадают в SQL-запросы.
- Регулярно обновлять СУБД и веб-приложения, чтобы закрыть известные уязвимости.
- Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Если вы обнаружили такую строку в логах своего сервера, это может означать, что ваш сайт пытались взломать. Стоит немедленно проверить код на наличие уязвимостей и принять меры.
Заключение
Строка "))) AND EXTRACTVALUE(2131,CONCAT(0x7e,((SELECT (ELT(2131=2131,1)))),0x7e))-- - — это не случайный набор символов, а рабочий инструмент хакера. Она демонстрирует, как можно использовать особенности функций MySQL для извлечения данных через ошибки. Понимание таких атак помогает разработчикам и администраторам лучше защищать свои системы.
Комментарии
—Войдите, чтобы оставить комментарий