Что означает запрос OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -

Эта строка — типичный пример SQL-инъекции, а точнее её разновидности, называемой error-based SQL injection (инъекция, основанная на ошибках). Она предназначена для извлечения данных из базы данных путём провоцирования ошибки, в тексте которой будут содержаться нужные злоумышленнику сведения.

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

Разбор синтаксиса

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

Теперь основная часть: OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e)).

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

Итог: функция EXTRACTVALUE попытается обработать XPath-выражение, начинающееся с символа «~», что вызовет ошибку вида «XPATH syntax error: '~1~'». В этом сообщении об ошибке и будут содержаться данные, которые злоумышленник пытается получить.

Зачем это нужно злоумышленнику?

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

  • Получить версию СУБД, имя базы данных, текущего пользователя.
  • Извлечь содержимое таблиц: логины, пароли, персональные данные.
  • Обойти аутентификацию, если инъекция в форме входа.

В данном конкретном примере выводится просто '1', что говорит о том, что это, скорее всего, тестовая строка для проверки уязвимости. Реальный злоумышленник заменил бы подзапрос на что-то вроде SELECT password FROM users LIMIT 1.

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

Предположим, есть уязвимый параметр id в URL: http://example.com/product?id=1. Запрос в приложении может выглядеть так:

SELECT * FROM products WHERE id = 1;

Злоумышленник подставляет:

1 OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -

В результате SQL-запрос становится:

SELECT * FROM products WHERE id = 1 OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -;

База данных выполняет EXTRACTVALUE и возвращает ошибку с текстом «~1~». Если приложение отображает эту ошибку, злоумышленник понимает, что инъекция возможна, и может продолжить извлечение данных.

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

Основной метод защиты — использование параметризованных запросов (prepared statements). В этом случае данные никогда не интерпретируются как SQL-код, и инъекция невозможна. Дополнительные меры:

  • Экранирование специальных символов с помощью функций вроде mysqli_real_escape_string (но это менее надёжно).
  • Отключение вывода ошибок базы данных на продакшене (чтобы злоумышленник не видел текст ошибок).
  • Использование ORM, которые по умолчанию используют параметризацию.
  • Регулярное обновление СУБД и фреймворков.
  • Проведение аудита кода и пентестов.
SQL-инъекции остаются в топ-10 OWASP уже много лет, и error-based инъекции — лишь одна из многих техник. Никогда не доверяйте пользовательскому вводу!

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

Если вы администратор и обнаружили подобную запись в логах, это признак того, что ваш сайт пытались взломать. Не паникуйте, но примите меры:

  1. Проверьте, не уязвим ли ваш сайт. Попробуйте ввести безобидную инъекцию в тестовой среде.
  2. Просмотрите код на предмет конкатенации SQL-запросов с пользовательскими данными.
  3. Установите WAF (Web Application Firewall), который может блокировать подобные запросы.
  4. Обновите CMS и плагины.

Если же вы обычный пользователь и увидели такую строку, например, в поле ввода на сайте, — это может быть результатом работы сканера уязвимостей. Не вводите её самостоятельно, если не понимаете последствий.

Заключение

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

Источники