Что это за строка?
Перед нами фрагмент полезной нагрузки (payload), используемый при error-based SQL-инъекции — атаке на веб-приложения, при которой злоумышленник извлекает данные из базы через сообщения об ошибках СУБД. Строка `) AND EXTRACTVALUE(7275,CONCAT(0x7e,((SELECT (ELT(7275=7275,1)))),0x7e))-- - предназначена для внедрения в уязвимый SQL-запрос, скорее всего в СУБД MySQL. Она не является вредоносной сама по себе, но демонстрирует технику, которой пользуются пентестеры и атакующие для проверки защищённости приложений.
В данной статье мы разберём каждый элемент этой конструкции, объясним её назначение и расскажем, как от неё защититься.
Разбор payload по частям
Строка состоит из нескольких вложенных функций и операторов. Рассмотрим их по порядку.
1. Начальный символ `)
Фрагмент `) (закрывающая круглая скобка и обратная кавычка) нужен, чтобы «закрыть» предыдущую часть оригинального SQL-запроса, в который внедряется атакующий. Например, если исходный запрос выглядел как SELECT * FROM users WHERE name = ('$input'), то подстановка `) разорвёт строку и позволит добавить собственные условия. Обратная кавычка часто используется в MySQL для экранирования идентификаторов, и её закрытие тоже может быть необходимо.
2. Оператор AND
Логическое «И» позволяет присоединить дополнительное условие к WHERE или HAVING. Если внедрение происходит в WHERE, то конструкция AND ... выполнится только при истинности предыдущих условий, но для error-based инъекции это не критично: главное — вызвать ошибку.
3. Функция EXTRACTVALUE(7275, ...)
EXTRACTVALUE — встроенная функция MySQL (и MariaDB), предназначенная для извлечения значения из XML-фрагмента. Она принимает два аргумента: XML-документ и XPath-выражение. Если первый аргумент не является корректным XML, функция генерирует ошибку. В нашем случае первый аргумент — число 7275, что заведомо не XML. Это и нужно атакующему: ошибка будет содержать результат вычисления второго аргумента.
4. CONCAT(0x7e, ..., 0x7e)
CONCAT объединяет строки. Здесь она склеивает шестнадцатеричный код 0x7e (символ тильды ~), некоторое выражение и ещё одну тильду. Тильды служат маркерами, по которым в тексте ошибки легко найти внедрённые данные. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'.
5. (SELECT (ELT(7275=7275,1)))
Внутренний подзапрос. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь ELT(7275=7275, 1): условие 7275=7275 всегда истинно (возвращает 1), поэтому ELT(1, 1) вернёт 1. Это простейшая проверка работоспособности инъекции: если в ответе появится ошибка с числом 1, значит, внедрение выполнено. В реальных атаках вместо 1 подставляют подзапрос, например (SELECT password FROM users LIMIT 1), чтобы извлечь данные.
6. Комментарий -- -
Два дефиса и пробел (или дефис) в MySQL начинают комментарий до конца строки. Это позволяет «отрезать» оставшуюся часть оригинального запроса, чтобы синтаксис стал корректным. Вариант -- - часто используется, когда после -- нужен пробел, но в URL его заменяют на дефис или плюс.
Зачем это нужно атакующему?
Error-based SQL-инъекция — один из методов извлечения информации из базы данных, когда приложение не выводит результаты запроса напрямую, но показывает сообщения об ошибках СУБД. С помощью EXTRACTVALUE (или аналогичных функций, таких как UPDATEXML) злоумышленник может заставить базу вернуть произвольные данные в тексте ошибки. Например, подставив вместо ELT(7275=7275,1) подзапрос (SELECT version()), он получит версию MySQL. Постепенно можно извлечь имена таблиц, столбцов и содержимое записей.
Подобные строки часто встречаются в логах веб-серверов, в отчётах систем обнаружения вторжений (IDS) и в материалах по безопасности. Они не являются вирусом или программой — это просто текст, который может быть передан на сервер, если в приложении есть уязвимость.
Как защититься от таких инъекций?
Основной способ — использовать параметризованные запросы (prepared statements) и хранимые процедуры с привязкой параметров. Никогда не подставляйте пользовательский ввод напрямую в SQL-код. Дополнительные меры:
- Экранирование специальных символов (например, функция
mysqli_real_escape_stringв PHP), но это менее надёжно, чем параметризация. - Валидация и фильтрация входных данных по белому списку.
- Отключение вывода подробных ошибок СУБД в production-окружении (чтобы атакующий не видел текст ошибок).
- Использование веб-фаерволов (WAF) для блокировки подозрительных конструкций.
- Регулярное обновление СУБД и приложений.
Если вы встретили такую строку в логах, это повод проверить код приложения на наличие уязвимостей и убедиться, что все запросы к базе данных используют параметризацию.
Вывод
Строка `) AND EXTRACTVALUE(7275,CONCAT(0x7e,((SELECT (ELT(7275=7275,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Она демонстрирует, как с помощью встроенных функций можно вызвать ошибку, содержащую полезные данные. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий