Что это за строка?

Строка ')))) 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 инъекция

Механизм прост:

  1. Злоумышленник находит уязвимый параметр, который подставляется в SQL-запрос без должной обработки.
  2. Он внедряет вызов EXTRACTVALUE с XPath, содержащим подзапрос.
  3. MySQL пытается выполнить XPath и, обнаружив ошибку, возвращает её текст, включающий результат подзапроса.
  4. Атакующий читает данные из сообщения об ошибке.

Это один из самых быстрых способов извлечения информации, так как не требует слепого перебора (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 для извлечения данных через сообщения об ошибках. Понимание таких конструкций необходимо для построения безопасных веб-приложений и анализа инцидентов информационной безопасности.

Помните: лучшая защита — это параметризованные запросы и минимизация привилегий базы данных.

Источники