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

Строка ))) 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. Понимание таких техник помогает разработчикам лучше защищать свои приложения.

Источники