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

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

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

Основная идея — заставить базу данных выполнить вредоносный SQL-запрос и вернуть результат в тексте ошибки. В MySQL для этого часто применяют функцию EXTRACTVALUE(XML, XPath), которая извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath содержит недопустимые символы, MySQL генерирует ошибку, включающую переданную строку.

В нашем примере:

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

В результате MySQL пытается вычислить XPath вида ~1~, что вызывает ошибку: XPATH syntax error: '~1~'. В тексте ошибки злоумышленник видит внедрённые данные.

Зачем это нужно?

Цель — извлечь информацию из базы данных, когда прямой вывод результатов недоступен. Меняя подзапрос, атакующий может получить имена таблиц, колонок, логины, пароли и другие конфиденциальные данные. Например, вместо ELT(7925=7925,1) можно подставить (SELECT version()), и в ошибке отобразится версия MySQL.

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

Пример реальной атаки

Предположим, на сайте есть форма поиска, которая подставляет пользовательский ввод в SQL-запрос без экранирования. Злоумышленник вводит:

' AND EXTRACTVALUE(7925,CONCAT(0x7e,((SELECT (ELT(7925=7925,1)))),0x7e))-- -

Если приложение уязвимо, оно вернёт ошибку MySQL с текстом XPATH syntax error: '~1~'. Это подтверждает наличие уязвимости и возможность дальнейшей эксплуатации.

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

Основные меры профилактики:

  1. Использовать подготовленные выражения (prepared statements) с параметризацией запросов. Это самый надёжный способ предотвратить SQL-инъекции.
  2. Экранировать специальные символы в пользовательском вводе, если параметризация невозможна.
  3. Ограничить права пользователя БД, чтобы даже при успешной инъекции злоумышленник не мог получить доступ к критичным данным.
  4. Отключить вывод подробных ошибок в production-окружении, чтобы не раскрывать структуру БД.
  5. Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.

Заключение

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

Источники