Что такое OR EXTRACTVALUE(1451,CONCAT(0x7e,...))-- -

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

Цель такого запроса — либо проверить, уязвим ли сайт (например, параметр URL или поле формы), либо извлечь данные из базы. Чаще всего подобные строки встречаются в автоматических сканерах уязвимостей и эксплойтах для MySQL/MariaDB.

Разбор по компонентам

EXTRACTVALUE

EXTRACTVALUE — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Синтаксис: EXTRACTVALUE(xml_fragment, xpath_expr). Если XPath-выражение некорректно или возвращает не один узел, функция генерирует ошибку. Именно это свойство и используют атакующие: в текст ошибки попадает результат вычисления вложенного выражения.

В нашем случае первым аргументом идёт число 1451 — это не XML, но MySQL попытается интерпретировать его как XML-фрагмент и при разборе XPath-выражения (второго аргумента) выдаст ошибку, содержащую переданную строку.

CONCAT и 0x7e

CONCAT склеивает строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильды добавляют по краям, чтобы в сообщении об ошибке было легко найти внедрённые данные: они служат маркерами. Это стандартный приём в error-based инъекциях.

ELT и условие 1451=1451

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(1451=1451,1) — первый аргумент является логическим выражением. В MySQL 1451=1451 всегда истинно (1), поэтому ELT вернёт первый элемент — строку '1'. Это нужно, чтобы получить предсказуемое значение, которое затем попадёт в ошибку. В более сложных вариантах вместо 1451=1451 может стоять подзапрос, извлекающий данные (например, имя пользователя или хеш пароля).

Оператор OR и комментарий -- -

OR — логическое «или», которое делает всё выражение истинным независимо от левой части исходного условия (например, WHERE id = 1). Это позволяет обойти фильтрацию и гарантировать выполнение внедрённой функции.

-- - — комментарий в MySQL (два дефиса, пробел и дефис для надёжности). Он «отрезает» остаток оригинального запроса, чтобы синтаксис остался корректным.

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

Предположим, есть уязвимый запрос: SELECT * FROM products WHERE id = 1. Атакующий подставляет:

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

Итоговый запрос:

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

MySQL попытается вычислить EXTRACTVALUE. Второй аргумент после CONCAT станет строкой ~1~. При разборе XPath возникнет ошибка вида: XPATH syntax error: '~1~'. Если сайт отображает ошибки БД, атакующий увидит этот текст и поймёт, что инъекция работает. Заменив ELT(1451=1451,1) на подзапрос, например (SELECT password FROM users LIMIT 1), можно постепенно извлекать данные посимвольно или целыми строками.

Чем опасна такая инъекция

  • Утечка данных: через сообщения об ошибках можно вытащить имена таблиц, логины, хеши паролей, номера телефонов и другую конфиденциальную информацию.
  • Обход аутентификации: конструкция с OR может изменить логику запроса и пустить злоумышленника без пароля.
  • Автоматизация атак: подобные строки легко генерируются инструментами (sqlmap и др.), что делает атаки массовыми.

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

  1. Параметризованные запросы (prepared statements) — главный способ. Никогда не склеивайте SQL из пользовательского ввода.
  2. Валидация и белые списки: если ожидается число, приводите к числу и проверяйте диапазон.
  3. Экранирование специальных символов — вспомогательная мера, но не замена параметризации.
  4. Отключение вывода ошибок БД на продакшене: сообщения об ошибках не должны попадать в браузер.
  5. Регулярные сканирования и аудит кода, использование WAF как дополнительного слоя.
Важно: даже если сайт не показывает ошибки, error-based инъекция может быть использована «слепым» методом — по времени ответа или по коду состояния. Поэтому полагаться только на скрытие ошибок нельзя.

Итог

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

Источники