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

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

Разбор по элементам

Символ ` (обратная кавычка)

В MySQL обратная кавычка используется для экранирования идентификаторов (имён таблиц, столбцов). В начале строки она, скорее всего, закрывает ранее открытый идентификатор в оригинальном запросе, чтобы «разорвать» его и добавить собственный код. Это типичный приём при инъекции в параметр, который подставляется в запрос без должной обработки.

OR

Оператор OR изменяет логику существующего условия SQL-запроса. Если исходный запрос проверял, например, id = 1, то добавление OR ... делает условие всегда истинным (или запускает выполнение вложенного выражения), что позволяет обойти аутентификацию или получить доступ к данным.

EXTRACTVALUE(7644, CONCAT(...))

EXTRACTVALUE — функция MySQL, которая извлекает значение из XML-фрагмента. Она часто используется в инъекциях для принудительного вызова ошибки, содержащей полезную нагрузку. Первый аргумент (7644) — произвольное число, второй — строка, сформированная через CONCAT. Если второй аргумент не является корректным XML, MySQL выдаёт ошибку вида XPATH syntax error: '...', в тексте которой оказываются данные, переданные в функцию.

CONCAT(0x7e, ..., 0x7e)

CONCAT объединяет строки. Здесь используются шестнадцатеричные литералы 0x7e — это ASCII-код символа ~ (тильда). Тильда служит маркером, который обрамляет извлекаемые данные, чтобы их было легко найти в сообщении об ошибке. Например, если нужно вытащить версию базы, в середину помещают @@version, и в ошибке появится ~5.7.33~.

SELECT (ELT(7644=7644,1))

ELT — функция MySQL, возвращающая N-й элемент из списка строк. Выражение 7644=7644 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. В данном примере это просто демонстрация работоспособности инъекции: в реальной атаке вместо 1 подставляют подзапрос, например (SELECT password FROM users LIMIT 1). Таким образом, ELT позволяет динамически формировать строку для CONCAT.

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

Два дефиса с пробелом (или -- -) в MySQL начинают комментарий до конца строки. Это нужно, чтобы «отрезать» оставшуюся часть оригинального запроса, которая могла бы вызвать синтаксическую ошибку или помешать выполнению внедрённого кода. Пробел после -- обязателен по стандарту MySQL.

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

Предположим, есть уязвимый запрос: SELECT * FROM articles WHERE id = '$_GET[id]'. Если передать в параметр id нашу строку, итоговый запрос примет вид:

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

База данных выполнит EXTRACTVALUE, что приведёт к ошибке с текстом, содержащим ~1~. Если приложение выводит ошибки MySQL на экран, злоумышленник увидит этот результат. Заменив 1 на подзапрос, можно извлечь любые данные: имена таблиц, логины, пароли.

Меры защиты

  • Параметризованные запросы (prepared statements) — главный способ предотвращения SQL-инъекций. Они разделяют код и данные, поэтому внедрённые строки не интерпретируются как SQL.
  • Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером БД (например, mysqli_real_escape_string в PHP).
  • Отключение вывода ошибок БД — не показывайте пользователям тексты ошибок MySQL, чтобы не давать подсказок атакующему.
  • Принцип наименьших привилегий — учётная запись веб-приложения должна иметь только необходимые права (обычно только SELECT/INSERT/UPDATE для конкретных таблиц).
  • Регулярное обновление СУБД — исправления закрывают известные уязвимости.

Заключение

Рассмотренная строка — типичный пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE для вызова ошибки с внедрёнными данными. Понимание механики таких атак помогает разработчикам и специалистам по безопасности правильно выстраивать защиту. Никогда не используйте подобные конструкции на реальных системах без разрешения — это незаконно.

Источники