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

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

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

Разберём payload по частям:

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

В результате выполнения такого запроса MySQL выдаст ошибку вида XPATH syntax error: '~1~'. Если вместо 1 подставить подзапрос, например (SELECT password FROM users LIMIT 1), то в тексте ошибки появится хеш пароля. Это позволяет злоумышленнику посимвольно или целиком извлекать данные из базы.

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

Error-based инъекции — один из самых простых и быстрых способов получить доступ к данным. Они не требуют сложной настройки, как blind SQL-инъекции, и сразу возвращают результат в ответе сервера. Если приложение не фильтрует пользовательский ввод и выводит ошибки СУБД на страницу, атакующий может:

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

Подобные уязвимости часто становятся причиной крупных утечек. Например, в 2023 году многие веб-приложения на PHP с устаревшими библиотеками были уязвимы к error-based инъекциям через функции EXTRACTVALUE и UPDATEXML.

Пример эксплуатации

Рассмотрим упрощённый сценарий. Исходный запрос в приложении:

SELECT * FROM articles WHERE id = '$_GET[id]'

Если передать в параметр id строку 1' OR EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то запрос примет вид:

SELECT * FROM articles WHERE id = '1' OR EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -'

MySQL выполнит подзапрос SELECT version(), получит, например, 8.0.32, затем попытается разобрать строку ~8.0.32~ как XPath и выдаст ошибку: XPATH syntax error: '~8.0.32~'. Эта ошибка вернётся в браузер, и злоумышленник узнает версию СУБД. Аналогично можно извлечь любые другие данные.

Меры защиты

Чтобы предотвратить такие атаки, необходимо применять комплексный подход:

  1. Параметризованные запросы (prepared statements). Это самый надёжный способ. Вместо конкатенации строк используйте плейсхолдеры и передавайте данные отдельно. Например, в PHP с PDO: $stmt = $pdo->prepare('SELECT * FROM articles WHERE id = ?'); $stmt->execute([$id]);.
  2. Экранирование специальных символов. Если по каким-то причинам нельзя использовать подготовленные выражения, применяйте функции экранирования, например mysqli_real_escape_string(). Но помните, что это менее надёжно.
  3. Отключение вывода ошибок СУБД в продакшене. Сообщения об ошибках должны логироваться, а пользователю показываться общая страница ошибки. Это затруднит эксплуатацию error-based инъекций.
  4. Ограничение прав пользователя базы данных. Приложение должно подключаться к БД под учётной записью с минимально необходимыми правами (только SELECT, INSERT, UPDATE для нужных таблиц). Это снизит ущерб в случае взлома.
  5. Регулярное обновление СУБД и библиотек. В новых версиях MySQL некоторые опасные функции могут быть удалены или изменены, что усложняет атаку.
  6. Использование WAF (Web Application Firewall). Современные WAF умеют обнаруживать характерные сигнатуры error-based инъекций, включая EXTRACTVALUE и UPDATEXML.

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

Заключение

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

Источники