Что это за строка?
Строка ))) AND EXTRACTVALUE(5150,CONCAT(0x7e,((SELECT (ELT(5150=5150,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через вывод сообщения об ошибке. В данном случае злоумышленник пытается заставить сервер выполнить функцию EXTRACTVALUE, которая при определённых условиях генерирует ошибку, содержащую результат подзапроса.
Разбор компонентов инъекции
Рассмотрим каждый элемент подробнее.
EXTRACTVALUE
EXTRACTVALUE(XML_fragment, XPath_expression) — это встроенная функция MySQL, предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Она возвращает текстовое содержимое фрагмента XML. Однако если XPath-выражение содержит синтаксическую ошибку, MySQL генерирует сообщение об ошибке, в котором отображается часть переданного XPath. Это и используется для внедрения.
CONCAT и 0x7e
CONCAT(0x7e, ((SELECT (ELT(5150=5150,1)))), 0x7e) — объединяет символ ~ (0x7e в шестнадцатеричном виде) с результатом подзапроса и ещё одним ~. Символ ~ служит маркером, по которому в сообщении об ошибке можно легко найти внедрённые данные. Он не является частью XPath и вызывает ошибку, так как XPath не допускает такой символ в начале выражения.
ELT и условие 5150=5150
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(5150=5150, 1) — выражение 5150=5150 всегда истинно, что в числовом контексте даёт 1. Значит, ELT(1, 1) вернёт строку '1'. Это простейший пример: если бы вместо 5150=5150 стояло условие, зависящее от данных (например, ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)) > 100), то результат ELT менялся бы в зависимости от истинности условия, и через ошибку можно было бы побитово извлекать информацию.
Завершение: -- -
Комментарий -- - (с пробелом после двух дефисов) отсекает остаток оригинального SQL-запроса, чтобы синтаксис оставался корректным. В MySQL комментарий начинается с -- (два дефиса и пробел) или #.
Как это работает на практике
Предположим, уязвимый запрос выглядит так:
SELECT * FROM articles WHERE id = '))) AND EXTRACTVALUE(5150,CONCAT(0x7e,((SELECT (ELT(5150=5150,1)))),0x7e))-- -';
После подстановки параметра id получается:
SELECT * FROM articles WHERE id = '))) AND EXTRACTVALUE(5150,CONCAT(0x7e,((SELECT (ELT(5150=5150,1)))),0x7e))-- -';
Закрывающая кавычка и скобки в начале ))) нужны, чтобы закрыть ранее открытые конструкции в оригинальном запросе (например, если id был в скобках). Затем следует AND EXTRACTVALUE(...). MySQL пытается вычислить XPath-выражение ~1~, что вызывает ошибку:
XPATH syntax error: '~1~'
В сообщении об ошибке мы видим ~1~ — это результат подзапроса. Если бы вместо 1 был, например, пароль пользователя, он бы отобразился в ошибке. Такой метод называется error-based SQL injection.
Зачем это нужно злоумышленнику?
Цель — получить данные из базы, которые не отображаются на странице. Используя ошибки, можно извлекать имена таблиц, колонок, логины, пароли, хеши и другую конфиденциальную информацию. Поскольку MySQL возвращает часть XPath в тексте ошибки, инъекция позволяет обойти ограничения на вывод данных.
Подобные инъекции часто встречаются в старых приложениях, где входные параметры не фильтруются. Современные фреймворки и ORM используют параметризованные запросы, что делает такие атаки невозможными.
Меры защиты
- Параметризованные запросы (prepared statements) — основной способ предотвращения SQL-инъекций.
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string. - Валидация входных данных — проверка типов, длины, допустимых символов.
- Ограничение прав пользователя БД — не давайте приложению прав на чтение системных таблиц.
- Регулярные обновления СУБД и фреймворков.
Важно понимать: демонстрация таких строк — это не призыв к действию, а иллюстрация уязвимости. Использование SQL-инъекций без разрешения владельца системы преследуется по закону.
Заключение
Строка ))) AND EXTRACTVALUE(5150,CONCAT(0x7e,((SELECT (ELT(5150=5150,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции через функцию EXTRACTVALUE. Она показывает, как злоумышленники могут извлекать данные, используя сообщения об ошибках MySQL. Понимание таких техник помогает разработчикам лучше защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий