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

Строка 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 символов).

Меры защиты

Чтобы предотвратить такие атаки, необходимо:

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

Заключение

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

Источники