Что это за строка?
Строка вида %")))) AND EXTRACTVALUE(5159,CONCAT(0x7e,((SELECT (ELT(5159=5159,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (SQL-инъекции на основе ошибок) для СУБД MySQL. Подобные конструкции используются злоумышленниками для извлечения данных из базы данных через вывод сообщения об ошибке.
Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Давайте разберём его по частям.
Анатомия инъекции
Разберём строку по компонентам:
- %")))) — последовательность, которая закрывает исходный SQL-запрос. Символ
%часто используется как подстановочный знак в LIKE-запросах, а кавычка и скобки нужны, чтобы «разорвать» легитимный запрос и добавить свой код. - AND — логический оператор, присоединяющий вредоносное условие к исходному запросу.
- EXTRACTVALUE(5159, CONCAT(0x7e, ..., 0x7e)) — вызов XML-функции MySQL, которая извлекает значение из XML-документа. Если XPath-выражение некорректно, MySQL генерирует ошибку, содержащую переданные данные.
- CONCAT(0x7e, ..., 0x7e) — объединение строк.
0x7e— это шестнадцатеричный код символа~(тильда), который служит маркером начала и конца извлекаемых данных в сообщении об ошибке. - (SELECT (ELT(5159=5159,1))) — подзапрос, возвращающий
1, если условие5159=5159истинно. В реальной атаке вместо этого подзапроса подставляется запрос к системным таблицам, напримерSELECT database()илиSELECT user(). - -- - — комментарий, который «отрезает» остаток исходного SQL-запроса, чтобы он не вызвал синтаксическую ошибку.
Как работает EXTRACTVALUE
Функция EXTRACTVALUE в MySQL принимает два аргумента: XML-документ и XPath-выражение, и возвращает скалярное значение найденного узла. Если XPath-выражение некорректно (например, содержит недопустимые символы), MySQL выбрасывает ошибку вида:
XPATH syntax error: '~имя_базы~'
Именно эту особенность и эксплуатируют злоумышленники: они передают в XPath результат подзапроса, обёрнутый в тильды, и получают его в тексте ошибки. Таким образом, даже если приложение не выводит данные напрямую, ошибка «сливает» информацию.
Зачем это нужно атакующему
Error-based SQL-инъекции — один из самых быстрых способов извлечения данных. В отличие от слепых (blind) инъекций, где приходится задавать множество вопросов «да/нет», здесь сервер сам возвращает искомое значение в сообщении об ошибке. С помощью таких конструкций можно получить:
- имя текущей базы данных (
database()); - версию MySQL (
version()); - имя пользователя (
user()); - список таблиц и колонок из
information_schema; - логины, пароли, хеши и другие конфиденциальные данные.
Символы ~ (0x7e) используются как разделители, чтобы атакующий мог легко выделить нужный фрагмент из длинного текста ошибки.
Почему это опасно
Успешная SQL-инъекция может привести к полной компрометации базы данных: утечке персональных данных пользователей, изменению или удалению записей, а в некоторых случаях — к выполнению произвольных команд на сервере. По данным OWASP, инъекции остаются одной из самых критичных уязвимостей веб-приложений на протяжении многих лет.
Как защититься
Главное правило — никогда не конкатенировать пользовательский ввод в SQL-запросы. Используйте подготовленные выражения (prepared statements) с параметризацией:
- В PHP — PDO или mysqli с привязкой параметров.
- В Java — PreparedStatement.
- В Python — параметризованные запросы в psycopg2, sqlite3 и т.п.
Дополнительные меры:
- Валидация и фильтрация входных данных на стороне сервера.
- Ограничение прав пользователя БД: приложение не должно работать под root.
- Отключение вывода подробных ошибок в продакшене — это усложняет error-based атаки.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Регулярное обновление СУБД и фреймворков.
Вывод
Строка с EXTRACTVALUE и CONCAT — это не случайный мусор, а тщательно сконструированный эксплойт для error-based SQL-инъекции в MySQL. Понимание того, как он устроен, помогает разработчикам и специалистам по безопасности своевременно распознавать атаки и выстраивать надёжную защиту. Помните: безопасность базы данных начинается с параметризованных запросов и минимальных привилегий.
Комментарии
—Войдите, чтобы оставить комментарий