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

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

В данной статье мы подробно разберём каждый элемент этой строки, объясним, как работает механизм, и расскажем, как защитить веб-приложение от подобных атак.

Разбор конструкции по частям

Рассмотрим каждый компонент запроса:

  • AND — логический оператор, который пытается изменить условие существующего SQL-запроса. Добавляя AND ..., атакующий надеется, что исходный запрос выполнится только при истинности внедрённого условия, что позволяет влиять на логику выборки.
  • EXTRACTVALUE(6534, CONCAT(...)) — функция MySQL, предназначенная для извлечения значения из XML-документа. Однако при передаче некорректного XPath-выражения она генерирует ошибку, которая содержит переданную строку. Это и используется для вывода данных.
  • CONCAT(0x7e, ..., 0x7e) — конкатенация значений. 0x7e — шестнадцатеричное представление символа «~» (тильда) в ASCII. Тильда используется как маркер, чтобы облегчить поиск извлечённых данных в сообщении об ошибке.
  • (SELECT (ELT(6534=6534,1))) — подзапрос, возвращающий результат функции ELT(). ELT(N, str1, str2, ...) возвращает строку с номером N. В данном случае условие 6534=6534 всегда истинно (равно 1), поэтому ELT(1,1) вернёт строку '1'. Это делает подзапрос предсказуемым и безопасным для демонстрации.
  • -- - — начало комментария в SQL. Всё, что идёт после -- (пробел и дефис), игнорируется сервером. Это позволяет отбросить оставшуюся часть оригинального запроса.

Как работает error-based инъекция?

Механизм основан на том, что MySQL при определённых условиях возвращает в тексте ошибки часть переданных данных. Функция EXTRACTVALUE() ожидает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно, сервер выбрасывает ошибку вида:

XPATH syntax error: '~1~'

В нашем случае в качестве XPath передаётся строка ~1~, полученная конкатенацией тильды, результата подзапроса и ещё одной тильды. Сообщение об ошибке содержит эту строку, что позволяет атакующему «увидеть» результат выполнения подзапроса.

В реальной атаке вместо ELT(6534=6534,1) может быть внедрён подзапрос, извлекающий, например, имя пользователя или хеш пароля из таблицы users. Например:

AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password FROM users LIMIT 1), 0x7e))

Тогда в ошибке появится хеш пароля, обрамлённый тильдами.

Почему используется ELT и условие 6534=6534?

Конструкция ELT(6534=6534,1) — это простой способ получить предсказуемое значение '1' без обращения к таблицам. Условие 6534=6534 всегда истинно, поэтому ELT возвращает первый элемент из списка (в данном случае '1'). Это часто применяется в демонстрационных целях или для проверки, что инъекция работает: если сервер вернёт ошибку с '~1~', значит, внедрение успешно.

В более сложных атаках вместо жёстко заданного числа может использоваться подзапрос, возвращающий интересующие данные.

Опасность и последствия

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

Кроме того, такие атаки могут привести к нарушению целостности данных (если злоумышленник использует INSERT, UPDATE или DELETE), а также к отказу в обслуживании.

Как защититься от SQL-инъекций

Основная мера — использование параметризованных запросов (prepared statements) с привязкой переменных. Это предотвращает интерпретацию пользовательского ввода как части SQL-кода.

Дополнительные меры:

  • Экранирование специальных символов с помощью функций типа mysqli_real_escape_string (но это не так надёжно, как подготовленные выражения).
  • Валидация и фильтрация входных данных на стороне приложения (например, проверка типов, белые списки).
  • Использование ORM (Object-Relational Mapping), которые автоматически применяют параметризацию.
  • Ограничение прав пользователя базы данных: приложению не нужны права на удаление таблиц или доступ к системным таблицам.
  • Регулярное обновление СУБД и фреймворков для устранения известных уязвимостей.
  • Внедрение WAF (Web Application Firewall) для блокировки подозрительных запросов.

Также рекомендуется отключить вывод подробных сообщений об ошибках в production-окружении, чтобы не давать атакующему дополнительной информации.

Заключение

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

Источники