Что это за строка?
Строка ')))) AND EXTRACTVALUE(4944,CONCAT(0x7e,((SELECT (ELT(4944=4944,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через принудительное создание ошибки, в тексте которой возвращаются нужные злоумышленнику сведения.
Подобные запросы часто встречаются в логах веб-серверов, WAF и систем обнаружения вторжений. Понимание их структуры помогает разработчикам и администраторам правильно настраивать защиту.
Разбор по частям
1. Закрывающие скобки и кавычки: '))))
В начале строки идут символы ')))). Это попытка «закрыть» оригинальный SQL-запрос, который, вероятно, выглядел как SELECT ... WHERE id = (('...')). Злоумышленник подставляет свои символы, чтобы разорвать исходную конструкцию и добавить собственный код.
2. AND — логическое условие
Оператор AND присоединяет вредоносное выражение к исходному запросу. Если исходное условие истинно, то и добавленное выражение будет вычислено. Это позволяет внедрить вызов функции, не нарушая синтаксис.
3. EXTRACTVALUE(4944, CONCAT(...))
EXTRACTVALUE — это встроенная функция MySQL, предназначенная для извлечения значения из XML-фрагмента по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(xml_fragment, xpath_expr). Однако в руках злоумышленника она превращается в инструмент атаки.
Если XPath-выражение содержит некорректный синтаксис, MySQL генерирует ошибку, в тексте которой отображается переданное значение. Именно это и нужно атакующему: он может поместить в XPath результат подзапроса, и СУБД вернёт его в сообщении об ошибке.
4. CONCAT(0x7e, ..., 0x7e)
CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильды используются как маркеры, чтобы в тексте ошибки легко найти границы извлечённых данных. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'. Всё, что между тильдами, — это результат подзапроса.
5. (SELECT (ELT(4944=4944,1)))
Здесь проверяется условие 4944=4944 (всегда истинно) и вызывается функция ELT(N, str1, str2, ...). ELT возвращает N-ю строку из списка. В данном случае N=1, и возвращается строка '1'. Это простейший пример; на практике вместо 1 может быть подзапрос, извлекающий имя базы, таблицы или хеш пароля.
В реальных атаках конструкция усложняется: например, ELT(1, (SELECT table_name FROM information_schema.tables LIMIT 1)).
6. Комментарий -- -
Два дефиса и пробел (или -- -) — это комментарий в SQL. Он «отрезает» остаток оригинального запроса, чтобы синтаксис остался корректным. В MySQL для комментария достаточно -- (с пробелом) или #.
Как работает error-based инъекция
Механизм прост:
- Злоумышленник находит уязвимый параметр, который подставляется в SQL-запрос без должной обработки.
- Он внедряет вызов
EXTRACTVALUEс XPath, содержащим подзапрос. - MySQL пытается выполнить XPath и, обнаружив ошибку, возвращает её текст, включающий результат подзапроса.
- Атакующий читает данные из сообщения об ошибке.
Это один из самых быстрых способов извлечения информации, так как не требует слепого перебора (boolean-based) или временных задержек (time-based).
Пример реальной эксплуатации
Предположим, есть запрос:
SELECT * FROM users WHERE id = '$_GET[id]'
Злоумышленник передаёт параметр id со значением:
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -
В результате MySQL выполнит:
SELECT * FROM users WHERE id = '1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -'
Если имя базы данных, например, shop, то ошибка будет:
XPATH syntax error: '~shop~'
Таким образом, атакующий узнаёт имя текущей базы.
Зачем нужны 0x7e и ELT?
0x7e — это шестнадцатеричный код символа ~. Тильда редко встречается в обычных данных, поэтому она служит надёжным разделителем. Иногда вместо неё используют 0x3a (двоеточие) или другие символы.
ELT позволяет выбрать конкретную строку из списка. В простейшем случае ELT(1, 'a', 'b') вернёт 'a'. В инъекции это нужно для того, чтобы вернуть результат подзапроса в виде строки. Без ELT можно обойтись, но ELT делает конструкцию более гибкой.
Как защититься от таких атак
Основные меры:
- Параметризованные запросы (prepared statements). Это самый надёжный способ. Данные передаются отдельно от SQL-кода, и внедрение становится невозможным.
- Экранирование специальных символов. Если параметризация недоступна, используйте функции экранирования (например,
mysqli_real_escape_string). - Валидация входных данных. Проверяйте, что параметр соответствует ожидаемому типу (число, дата и т.п.).
- Ограничение прав пользователя БД. Не давайте веб-приложению прав на чтение
information_schemaи других системных таблиц без необходимости. - Использование WAF. Веб-приложения-экраны могут блокировать известные шаблоны атак, но не заменяют исправление уязвимостей.
- Отключение вывода ошибок СУБД в продакшене. Если ошибки не показываются пользователю, error-based инъекция теряет смысл.
Заключение
Строка ')))) AND EXTRACTVALUE(4944,CONCAT(0x7e,((SELECT (ELT(4944=4944,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Она демонстрирует, как злоумышленники используют функции MySQL для извлечения данных через сообщения об ошибках. Понимание таких конструкций необходимо для построения безопасных веб-приложений и анализа инцидентов информационной безопасности.
Помните: лучшая защита — это параметризованные запросы и минимизация привилегий базы данных.
Комментарии
—Войдите, чтобы оставить комментарий