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

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

Подобные запросы часто встречаются в отчётах сканеров уязвимостей, в логах веб-серверов, в практических заданиях на платформах вроде DVWA, SQLZoo и в шпаргалках пентестеров. Если вы увидели такую строку — значит, кто-то (или автоматический сканер) проверял ваш сайт на наличие SQL-инъекций.

Разбираем конструкцию по частям

1. Закрывающая скобка и OR

Строка начинается с ) и OR. Это попытка «вырваться» из оригинального SQL-запроса, который, вероятно, выглядел как SELECT ... WHERE id = (какой-то параметр). Закрывающая скобка завершает исходное выражение, а OR позволяет добавить своё условие, не ломая синтаксис всего запроса.

2. Функция EXTRACTVALUE

EXTRACTVALUE(XML_fragment, XPath_expression) — встроенная функция MySQL для работы с XML. Она извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL выбрасывает ошибку вида XPATH syntax error: '...', в которой отображается проблемный фрагмент.

Именно эта особенность делает функцию идеальным инструментом для error-based инъекции: злоумышленник может подставить в XPath-выражение результат подзапроса, и сервер вернёт его в тексте ошибки.

3. CONCAT и 0x7e

CONCAT(0x7e, ..., 0x7e) — склеивает строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильды служат маркерами, чтобы в сообщении об ошибке было легко найти начало и конец извлечённого значения.

4. Подзапрос SELECT (ELT(7602=7602,1))

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае 7602=7602 — это всегда истина (1), поэтому ELT(1, 1) вернёт 1. Это простейшая проверка работоспособности инъекции. В реальной атаке вместо 1 подставляют, например, SELECT password FROM users LIMIT 1, и сервер возвращает пароль в тексте ошибки.

5. Комментарий -- -

-- - — это комментарий в SQL. Всё, что идёт после него, игнорируется. Пробел после -- обязателен, иначе некоторые СУБД не распознают комментарий. Дефис в конце часто добавляют для обхода фильтров, которые удаляют -- без пробела.

Как это работает на практике

Предположим, на сайте есть скрипт, который выполняет запрос:

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

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

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

MySQL выполнит подзапрос, получит версию сервера, попытается вставить её в XPath, потерпит неудачу и вернёт ошибку примерно такого вида:

XPATH syntax error: '~5.7.33~'

Так злоумышленник узнаёт версию MySQL. Аналогично можно извлечь имена таблиц, колонок, логины и пароли пользователей.

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

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

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

  1. Используйте подготовленные выражения (prepared statements). Это главный и самый надёжный способ. Параметры передаются отдельно от SQL-кода, и внедрить в них что-либо невозможно.
  2. Экранируйте пользовательский ввод. Если prepared statements недоступны, применяйте функции экранирования, например mysqli_real_escape_string().
  3. Ограничьте права пользователя БД. Не давайте веб-приложению прав на FILE, DROP и доступ к системным таблицам без необходимости.
  4. Отключите вывод ошибок на продакшене. Сообщения об ошибках MySQL не должны попадать в браузер пользователя — только в логи сервера.
  5. Используйте WAF. Веб-приложение firewall может отсеивать типичные сигнатуры SQL-инъекций, включая EXTRACTVALUE.
  6. Регулярно сканируйте сайт. Инструменты вроде SQLMap, OWASP ZAP помогут найти уязвимости до злоумышленников.

Легальные сценарии использования

Подобные конструкции применяются исключительно в легальном пентестинге — при тестировании собственных систем или в рамках договора с заказчиком. Использование SQL-инъекций против чужих сайтов без разрешения является уголовным преступлением (ст. 272 УК РФ — неправомерный доступ к компьютерной информации).

Платформы для обучения, такие как DVWA, SQLZoo, PortSwigger Web Security Academy, дают возможность отрабатывать эти техники в безопасной среде.

Итог

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

Источники