Что это за строка?
Строка %" OR EXTRACTVALUE(7584,CONCAT(0x7e,((SELECT (ELT(7584=7584,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных путём провоцирования ошибок, в текст которых подставляются результаты подзапросов. В данном случае применяются функции EXTRACTVALUE, CONCAT и ELT.
Разбор по частям
1. Начало: %" OR ...
Символ % и кавычка " имитируют закрытие строкового литерала в оригинальном запросе. Оператор OR добавляет логическое условие, которое должно быть истинным или ложным, чтобы повлиять на выполнение запроса. В error-based инъекциях часто добиваются именно ошибки, а не изменения логики.
2. Функция EXTRACTVALUE()
EXTRACTVALUE(XML_document, XPath_expression) — встроенная функция MySQL, предназначенная для извлечения значения из XML-документа по XPath-выражению. Если переданный XML-документ некорректен или XPath-выражение содержит ошибку, MySQL генерирует сообщение об ошибке, в которое попадает часть переданных данных. Это и используется для вывода результатов подзапроса.
В нашем случае первым аргументом идёт число 7584 — оно не является корректным XML, что само по себе может вызвать ошибку. Второй аргумент — CONCAT(0x7e, ((SELECT (ELT(7584=7584,1)))), 0x7e) — формирует строку, которая должна быть внедрена в сообщение об ошибке.
3. Функция CONCAT() и 0x7e
CONCAT() объединяет строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти границы внедрённых данных. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'. Это позволяет злоумышленнику однозначно идентифицировать результат выполнения подзапроса.
4. Подзапрос (SELECT (ELT(7584=7584,1)))
Внутри CONCAT выполняется подзапрос, который возвращает значение, внедряемое в ошибку. В данном примере используется функция ELT(N, str1, str2, ...) — она возвращает N-ю строку из списка. Выражение 7584=7584 всегда истинно (возвращает 1), поэтому ELT(1, 1) вернёт первую строку из списка — 1. Таким образом, подзапрос возвращает строку '1'. В реальной атаке вместо ELT(7584=7584,1) мог бы стоять подзапрос, извлекающий имя пользователя, версию БД или другие данные, например: (SELECT user()) или (SELECT table_name FROM information_schema.tables LIMIT 0,1).
5. Завершение: -- -
-- — комментарий в SQL (в MySQL требуется пробел после двух дефисов). Символ - после пробела гарантирует, что комментарий будет корректно распознан даже если СУБД требует пробел. Всё, что идёт после -- -, игнорируется. Это нужно, чтобы обрезать оставшуюся часть оригинального запроса и избежать синтаксических ошибок.
Зачем это нужно злоумышленнику?
Цель такой инъекции — получить информацию о базе данных через сообщения об ошибках. Когда приложение выводит ошибки СУБД пользователю (что является плохой практикой), атакующий может шаг за шагом извлекать имена таблиц, колонок, логины и пароли. Error-based инъекции особенно эффективны, когда UNION-инъекции невозможны (например, из-за ограничений на количество колонок или отсутствия вывода данных).
Пример работы
Предположим, уязвимый запрос выглядит так: SELECT * FROM users WHERE name = '$input'. Если подставить нашу строку, запрос примет вид:
SELECT * FROM users WHERE name = '%" OR EXTRACTVALUE(7584,CONCAT(0x7e,((SELECT (ELT(7584=7584,1)))),0x7e))-- -'MySQL выполнит EXTRACTVALUE и, скорее всего, вернёт ошибку вида: XPATH syntax error: '~1~'. Если приложение отобразит эту ошибку, злоумышленник увидит результат. Заменив ELT(7584=7584,1) на подзапрос, например (SELECT version()), он получит версию СУБД в тексте ошибки.
Меры защиты
- Параметризованные запросы (prepared statements) — самый надёжный способ предотвратить SQL-инъекции. Данные пользователя передаются отдельно от SQL-кода и не интерпретируются как часть запроса.
- Экранирование специальных символов — использование функций экранирования (например,
mysqli_real_escape_stringв PHP) снижает риск, но не является панацеей. - Отключение вывода ошибок СУБД — не показывайте пользователям тексты ошибок базы данных. Логируйте их на сервере.
- Принцип наименьших привилегий — учётная запись, используемая приложением для подключения к БД, должна иметь только необходимые права.
- Регулярное обновление СУБД и фреймворков — закрывает известные уязвимости.
Вывод
Конструкция %" OR EXTRACTVALUE(7584,CONCAT(0x7e,((SELECT (ELT(7584=7584,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции, демонстрирующий использование функций EXTRACTVALUE и ELT для извлечения данных через сообщения об ошибках. Понимание таких техник необходимо специалистам по безопасности для эффективной защиты веб-приложений. Разработчикам следует всегда использовать параметризованные запросы и не выводить ошибки БД конечным пользователям.
Комментарии
—Войдите, чтобы оставить комментарий