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

Строка ` AND EXTRACTVALUE(1621,CONCAT(0x7e,((SELECT (ELT(1621=1621,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции применяются злоумышленниками для извлечения информации из базы данных через вывод сообщений об ошибках. В данном случае используется функция EXTRACTVALUE, которая извлекает значение из XML-строки, но при неправильном формате вызывает ошибку, содержащую результат вложенного запроса.

Эта строка — не случайный набор символов, а тщательно сконструированная полезная нагрузка (payload), предназначенная для проверки уязвимости веб-приложения и, при успехе, для получения данных. Она начинается с обратного апострофа и логического оператора AND, что позволяет внедрить её в существующий SQL-запрос. Двойной дефис с пробелом в конце (-- -) — это комментарий, который отсекает оставшуюся часть оригинального запроса.

Как работает эта инъекция?

Разбор по компонентам

  • ` — обратный апостроф. Часто используется для закрытия строкового литерала в уязвимом параметре, если приложение не фильтрует кавычки.
  • AND — логический оператор, добавляющий условие к исходному запросу. Если инъекция проходит, поведение запроса меняется.
  • EXTRACTVALUE(1621, CONCAT(0x7e, ((SELECT (ELT(1621=1621,1)))), 0x7e)) — ключевая часть. Функция EXTRACTVALUE принимает два аргумента: XML-документ и XPath-выражение. В данном случае первый аргумент — число 1621 (произвольное), второй — результат CONCAT.
  • CONCAT(0x7e, ..., 0x7e) — объединяет символ тильды (0x7e — шестнадцатеричное представление символа ~) с результатом подзапроса и ещё одной тильдой. Тильды используются как маркеры, чтобы облегчить поиск выводимых данных в сообщении об ошибке.
  • SELECT (ELT(1621=1621,1)) — вложенный запрос. ELT возвращает N-й элемент из списка. Здесь 1621=1621 — всегда истинное условие, поэтому ELT возвращает 1. Это простейшая проверка, которая может быть заменена на любой другой запрос, например, на извлечение имени пользователя или хеша пароля.
  • -- - — комментарий, который игнорирует остаток исходного SQL-запроса.

Когда MySQL выполняет EXTRACTVALUE с числом вместо корректного XML, возникает ошибка: XPATH syntax error: '~1~'. В этом сообщении как раз и появляется результат подзапроса, обёрнутый в тильды. Злоумышленник может видеть этот текст ошибки в ответе сервера, если приложение не скрывает ошибки СУБД.

Зачем нужен ELT и CONCAT?

ELT(1621=1621,1) — это заглушка. В реальной атаке вместо неё подставляют SELECT к системным таблицам, например, SELECT table_name FROM information_schema.tables LIMIT 1. Функция CONCAT собирает результат в строку, а тильды позволяют легко найти начало и конец данных в сообщении об ошибке. Если бы тильд не было, можно было бы перепутать данные с другим текстом ошибки.

Число 1621 в первом аргументе EXTRACTVALUE не несёт смысловой нагрузки — это просто произвольное число, которое гарантированно вызовет ошибку, так как не является валидным XML.

Почему это опасно?

Error-based SQL-инъекции — один из самых быстрых способов извлечения данных из базы. В отличие от слепых инъекций, где злоумышленник вынужден задавать множество запросов и анализировать время отклика или логические условия, здесь результат приходит немедленно в виде текста ошибки. Это позволяет за считанные минуты получить имена таблиц, столбцов, логины, пароли и другую конфиденциальную информацию.

Уязвимость возникает, когда веб-приложение передаёт пользовательский ввод в SQL-запрос без должной обработки. Даже если приложение отображает общую страницу ошибки, но при этом записывает подробности в лог, злоумышленник может получить к ним доступ через другие каналы. Поэтому важно не только скрывать ошибки от пользователя, но и использовать параметризованные запросы.

Как защититься?

Основные меры

  1. Параметризованные запросы (prepared statements). Это самый надёжный способ. При использовании подготовленных выражений пользовательский ввод никогда не интерпретируется как SQL-код.
  2. Экранирование специальных символов. Если по каким-то причинам нельзя использовать параметризацию, необходимо применять функции экранирования, например, mysqli_real_escape_string в PHP. Но это менее надёжно.
  3. Отключение вывода ошибок СУБД. В production-окружении приложение не должно показывать пользователю сообщения об ошибках базы данных. Все ошибки должны логироваться на сервере, а клиенту выдаваться стандартный ответ.
  4. Ограничение прав пользователя БД. Учётная запись, от имени которой работает веб-приложение, должна иметь минимально необходимые права. Например, не должна иметь доступ к information_schema без необходимости.
  5. Использование WAF (Web Application Firewall). Современные WAF могут обнаруживать и блокировать попытки SQL-инъекций по сигнатурам, включая конструкции с EXTRACTVALUE.
  6. Регулярное обновление СУБД и фреймворков. В новых версиях MySQL некоторые опасные функции могут быть удалены или изменены, что снижает риск.

Что делать, если вы нашли такую строку в логах?

Если вы обнаружили подобную запись в логах веб-сервера или СУБД, это сигнал о том, что ваш сайт пытались взломать. Необходимо немедленно проверить код приложения на наличие уязвимостей, особенно в местах, где пользовательский ввод попадает в SQL-запросы. Также стоит проверить, не произошла ли утечка данных. В некоторых случаях злоумышленники могут использовать инъекцию не только для чтения, но и для модификации или удаления информации.

Помните: даже если атака не удалась, сам факт её попытки говорит о том, что ваш сайт представляет интерес для злоумышленников. Уделите время аудиту безопасности.

Заключение

Строка ` AND EXTRACTVALUE(1621,CONCAT(0x7e,((SELECT (ELT(1621=1621,1)))),0x7e))-- - — это яркий пример эксплойта для error-based SQL-инъекции в MySQL. Она демонстрирует, как можно использовать встроенные функции СУБД для вызова ошибок, содержащих полезные данные. Понимание принципов работы таких атак помогает разработчикам и администраторам лучше защищать свои системы. Никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.

Источники