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

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

Подобные запросы часто встречаются в отчётах систем обнаружения вторжений (IDS) и логах веб-серверов. Понимание их устройства помогает разработчикам и администраторам лучше защищать приложения.

Разбор по частям

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

  • ") — попытка закрыть ранее открытую скобку и строковый литерал в уязвимом запросе, чтобы внедрить свой код.
  • AND — логический оператор, добавляющий условие к исходному запросу.
  • EXTRACTVALUE(6411, CONCAT(...)) — функция MySQL, извлекающая значение из XML-фрагмента. При передаче некорректного XPath-выражения она генерирует ошибку, содержащую переданные данные.
  • CONCAT(0x7e, ..., 0x7e) — объединение строк. 0x7e — шестнадцатеричный код символа ~ (тильда), который используется как маркер для облегчения поиска извлечённых данных в сообщении об ошибке.
  • (SELECT (ELT(6411=6411,1))) — подзапрос, возвращающий результат функции ELT(). ELT(N, str1, str2, ...) возвращает строку по её номеру. Здесь условие 6411=6411 всегда истинно, поэтому ELT вернёт 1 (или строку '1'). В реальных атаках вместо всегда истинного условия подставляют логическое выражение, проверяющее данные (например, SUBSTRING(username,1,1)='a'), чтобы побайтово извлекать информацию.
  • -- - — комментарий, обрезающий остаток исходного запроса.

Принцип работы error-based инъекции

MySQL-функция EXTRACTVALUE() при некорректном XPath-выражении возвращает ошибку вида XPATH syntax error: '~1~'. Злоумышленник может подставить в XPath результат подзапроса, и сервер вернёт его в тексте ошибки. Это позволяет извлекать произвольные данные (имена таблиц, логины, пароли) посимвольно или целыми строками, если позволяет длина сообщения.

В данном примере подзапрос возвращает предсказуемое значение 1, поэтому ошибка будет содержать ~1~. Это демонстрационный запрос, показывающий работоспособность техники. В реальной атаке вместо ELT(6411=6411,1) могла бы быть, например, ELT(6411=6411, (SELECT password FROM users LIMIT 1)).

Важно: использование подобных конструкций без разрешения владельца системы является нарушением закона и может преследоваться по статье 272 УК РФ (неправомерный доступ к компьютерной информации).

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

Error-based инъекции позволяют атакующему получать данные из базы, даже если приложение не выводит результаты запросов на экран. Достаточно, чтобы сообщения об ошибках СУБД попадали в ответ сервера. Это один из самых распространённых векторов атак на веб-приложения.

По данным OWASP, SQL-инъекции входят в топ-10 критических угроз безопасности веб-приложений. Уязвимыми часто оказываются legacy-код, самописные CMS и приложения без параметризованных запросов.

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

  • Параметризованные запросы (prepared statements) — лучший способ предотвратить инъекции. Они разделяют код и данные.
  • Экранирование специальных символов — используйте встроенные функции драйвера БД, а не самодельные регулярные выражения.
  • Отключение вывода ошибок СУБД в production — сообщения об ошибках должны логироваться, но не отображаться пользователю.
  • Принцип наименьших привилегий — учётная запись приложения не должна иметь прав на чтение системных таблиц и выполнение опасных функций.
  • Регулярное обновление — используйте актуальные версии СУБД и фреймворков, чтобы закрыть известные уязвимости.
  • WAF (Web Application Firewall) — может блокировать известные шаблоны атак, но не заменяет исправление кода.

Заключение

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

Источники