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

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

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

Давайте разберём каждый элемент запроса.

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

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

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

Например, запрос EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e)) вернёт ошибку с версией MySQL.

В нашем случае ELT(1745=1745,1) возвращает 1, и ошибка будет содержать ~1~. Это тестовый запрос, чтобы убедиться, что инъекция работает.

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

SQL-инъекции — одна из самых распространённых уязвимостей веб-приложений (OWASP Top 10). Они позволяют злоумышленнику:

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

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

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

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

Пример безопасного кода на PHP (PDO)

$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute(['name' => $userInput]);

В этом случае даже если пользователь введёт %" OR EXTRACTVALUE(...), запрос будет обработан как строка, а не как SQL-код.

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

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

  • проверить код на наличие уязвимостей (особенно места, где пользовательский ввод попадает в SQL-запросы);
  • обновить CMS и библиотеки до последних версий;
  • провести аудит безопасности;
  • настроить мониторинг и оповещения о подозрительной активности.

Заключение

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

Источники