Что такое 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 и др.), что делает атаки массовыми.
Как защититься
- Параметризованные запросы (prepared statements) — главный способ. Никогда не склеивайте SQL из пользовательского ввода.
- Валидация и белые списки: если ожидается число, приводите к числу и проверяйте диапазон.
- Экранирование специальных символов — вспомогательная мера, но не замена параметризации.
- Отключение вывода ошибок БД на продакшене: сообщения об ошибках не должны попадать в браузер.
- Регулярные сканирования и аудит кода, использование WAF как дополнительного слоя.
Важно: даже если сайт не показывает ошибки, error-based инъекция может быть использована «слепым» методом — по времени ответа или по коду состояния. Поэтому полагаться только на скрытие ошибок нельзя.
Итог
Строка OR EXTRACTVALUE(1451,CONCAT(0x7e,((SELECT (ELT(1451=1451,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированный эксплойт для MySQL. Он использует функцию EXTRACTVALUE для принудительной генерации ошибки, CONCAT и тильды для маркировки вывода, ELT с заведомо истинным условием для получения предсказуемого значения и комментарий для обрезки запроса. Понимание механики таких атак помогает разработчикам и администраторам правильно выстраивать защиту: параметризовать запросы, скрывать ошибки и проводить регулярные проверки безопасности.
Комментарии
—Войдите, чтобы оставить комментарий