Что это за строка?
Строка OR EXTRACTVALUE(8626,CONCAT(0x7e,((SELECT (ELT(8626=8626,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в отчётах об уязвимостях и в инструментах для пентеста (например, sqlmap).
В отличие от UNION-инъекций, где данные выводятся прямо на странице, здесь злоумышленник заставляет базу данных сгенерировать ошибку, содержащую нужную информацию. Сервер возвращает эту ошибку, и атакующий видит результат.
Разбор по частям
Рассмотрим каждый элемент запроса:
- OR — логический оператор, который добавляется к оригинальному условию WHERE. Если исходное условие ложно, OR с истинным выражением сделает всё условие истинным, что может привести к выводу дополнительных строк или к выполнению внедрённой функции.
- EXTRACTVALUE(8626, CONCAT(...)) — функция MySQL для извлечения значения из XML. Первый аргумент — XML-документ (здесь просто число 8626, что вызывает ошибку, так как это не корректный XML). Второй аргумент — XPath-выражение, которое динамически формируется через CONCAT.
- CONCAT(0x7e, ((SELECT (ELT(8626=8626,1)))), 0x7e) — конкатенация строк. 0x7e — это шестнадцатеричное представление символа тильды (~). Внутри — подзапрос, который возвращает результат выражения ELT(8626=8626,1).
- ELT(8626=8626,1) — функция ELT возвращает N-й элемент из списка. Здесь N — это результат сравнения 8626=8626, который равен 1 (истина). Список состоит из одного элемента — числа 1. Таким образом, ELT возвращает 1.
- -- - — комментарий, который отсекает оставшуюся часть оригинального SQL-запроса.
Как это работает
Когда MySQL выполняет функцию EXTRACTVALUE, она анализирует XPath-выражение. Если XPath содержит недопустимые символы (например, тильду ~), MySQL генерирует ошибку вида: XPATH syntax error: '~1~'. В сообщении об ошибке отображается фрагмент XPath, который привёл к сбою. Именно туда и попадает результат подзапроса.
В нашем случае CONCAT собирает строку: тильда + результат ELT + тильда. ELT возвращает 1, поэтому XPath будет ~1~. MySQL выдаст ошибку: XPATH syntax error: '~1~'. Атакующий видит эту ошибку и понимает, что инъекция работает. В реальной атаке вместо ELT(8626=8626,1) подставляются другие выражения, например, (SELECT version()) или (SELECT password FROM users LIMIT 1). Тогда в ошибке отобразится версия СУБД или хеш пароля.
Зачем нужен ELT(8626=8626,1)?
Этот приём используется для проверки возможности инъекции. Если база данных возвращает ошибку с числом 1, значит, функция EXTRACTVALUE доступна и подзапросы выполняются. В более сложных эксплойтах вместо ELT могут быть другие функции, например, CONCAT_WS или MAKE_SET. Но ELT здесь — простейший способ вернуть константу.
Число 8626 — произвольное. Оно может быть любым, главное, чтобы сравнение 8626=8626 было истинным. Это делается для того, чтобы ELT вернул первый элемент списка (1). Если бы сравнение было ложным, ELT вернул бы NULL, и ошибка не содержала бы полезной информации.
Какие данные можно извлечь?
С помощью этой техники атакующий может получить:
- Версию MySQL
- Имя текущей базы данных
- Имена таблиц и колонок
- Логины и пароли пользователей
- Любые другие данные, доступные через SQL-запросы
Обычно для извлечения строк используются подзапросы с LIMIT и OFFSET, чтобы посимвольно вытаскивать информацию. Но EXTRACTVALUE позволяет вывести сразу целую строку, если она помещается в сообщение об ошибке (обычно до 32 символов).
Меры защиты
Чтобы предотвратить такие атаки, необходимо:
- Использовать параметризованные запросы (prepared statements) — это самый надёжный способ.
- Экранировать все пользовательские данные перед подстановкой в SQL.
- Ограничить права пользователя базы данных, чтобы он не мог выполнять опасные функции.
- Отключить вывод подробных ошибок на продакшене.
- Регулярно обновлять СУБД и использовать WAF.
Важно: данная информация предоставлена исключительно в ознакомительных целях. Использование SQL-инъекций против чужих систем без разрешения является незаконным.
Заключение
Строка OR EXTRACTVALUE(8626,CONCAT(0x7e,((SELECT (ELT(8626=8626,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, эксплуатирующей функцию EXTRACTVALUE в MySQL. Она показывает, как злоумышленники могут извлекать данные через сообщения об ошибках. Понимание таких техник помогает разработчикам и администраторам лучше защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий