Введение
Встречая в логах или в поле ввода подобную строку: ")))) AND EXTRACTVALUE(1011,CONCAT(0x7e,((SELECT (ELT(1011=1011,1)))),0x7e))-- -, многие задаются вопросом: что это и какова её цель? Это классический пример SQL-инъекции, нацеленной на извлечение данных из базы данных через вызов ошибок. В данной статье мы подробно разберём, как работает этот запрос, какие функции используются и как защититься от подобных атак.
Что такое SQL-инъекция?
SQL-инъекция (SQL injection) — один из самых распространённых способов взлома веб-приложений, при котором злоумышленник внедряет вредоносный SQL-код в запрос к базе данных. Это становится возможным, когда приложение не проверяет должным образом пользовательский ввод и передаёт его напрямую в SQL-запрос. Успешная инъекция может привести к утечке конфиденциальных данных, изменению или удалению информации, а в некоторых случаях — к полному контролю над сервером.
Существует несколько типов SQL-инъекций: основанные на ошибках (error-based), на времени (time-based), на логических выражениях (boolean-based) и другие. Рассматриваемый запрос относится к error-based инъекциям, так как он заставляет базу данных выдать сообщение об ошибке, содержащее полезные для атакующего данные.
Разбор запроса
Давайте разберём строку по частям:
"))))— последовательность кавычек и закрывающих скобок. Она нужна, чтобы «закрыть» предыдущие части оригинального SQL-запроса, которые могли быть открыты приложением. Например, если исходный запрос был видаSELECT * FROM users WHERE id = ('$input'), то вставка"))))может нарушить синтаксис и позволить добавить свои условия.AND EXTRACTVALUE(1011,CONCAT(0x7e,((SELECT (ELT(1011=1011,1)))),0x7e))— это основная часть инъекции. Функция EXTRACTVALUE извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL выдаёт ошибку, в тексте которой отображается переданный аргумент. Это и используется для вывода данных.-- -— комментарий, который «отрезает» оставшуюся часть оригинального запроса, чтобы он стал синтаксически корректным.
Функция EXTRACTVALUE
Согласно документации MySQL, EXTRACTVALUE(XML_frag, XPath_expr) возвращает текстовое содержимое узла XML, соответствующего XPath-выражению. Если XPath содержит ошибку, функция генерирует ошибку вида XPATH syntax error: '...', где ... — это часть переданного XPath-выражения. Именно это сообщение об ошибке видит атакующий, и в него можно «завернуть» результат подзапроса.
Функция CONCAT
CONCAT объединяет строки. В нашем случае она склеивает символ 0x7e (тильда ~), результат подзапроса и ещё одну тильду. Тильды используются как маркеры, чтобы облегчить извлечение данных из сообщения об ошибке.
Функция ELT
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Если N=1, возвращается первая строка. В нашем примере ELT(1011=1011,1) — условие 1011=1011 всегда истинно (1), поэтому возвращается строка '1'. Это простейший случай, но на практике вместо '1' может быть подзапрос, возвращающий имя пользователя, хэш пароля или другую конфиденциальную информацию.
Как это работает на практике
Предположим, уязвимый запрос выглядит так:
SELECT * FROM articles WHERE id = '$id';
Если злоумышленник передаст в параметр id строку 1 AND EXTRACTVALUE(1011,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то итоговый запрос станет:
SELECT * FROM articles WHERE id = '1' AND EXTRACTVALUE(1011,CONCAT(0x7e,(SELECT version()),0x7e))-- -';
База данных выполнит подзапрос SELECT version(), получит, например, 5.7.31, затем попытается вычислить XPath-выражение ~5.7.31~, что вызовет ошибку: XPATH syntax error: '~5.7.31~'. Эта ошибка будет возвращена приложению, и атакующий увидит версию СУБД. Аналогично можно извлечь имена таблиц, колонок и сами данные.
Цели атакующего
Основные цели SQL-инъекций:
- Получение доступа к конфиденциальным данным (пароли, номера кредитных карт, персональная информация).
- Обход аутентификации и авторизации.
- Изменение или удаление данных в базе.
- Выполнение произвольных команд на сервере (в некоторых конфигурациях).
В конкретном примере с EXTRACTVALUE атакующий, скорее всего, проводит разведку: пытается определить версию СУБД, имена таблиц и колонок, чтобы затем построить более сложный запрос для извлечения учётных данных.
Методы защиты
Чтобы предотвратить SQL-инъекции, необходимо применять комплекс мер:
- Использование параметризованных запросов (prepared statements). Это самый надёжный способ. При этом SQL-код и данные передаются раздельно, и база данных не интерпретирует ввод как часть запроса.
- Экранирование специальных символов. Если параметризация невозможна, следует использовать функции экранирования, предоставляемые драйвером БД (например,
mysqli_real_escape_stringв PHP). - Валидация и фильтрация входных данных. Проверяйте, соответствуют ли данные ожидаемому формату (число, email, дата и т.п.).
- Ограничение прав пользователя БД. Приложение должно работать под учётной записью с минимально необходимыми правами (не использовать root).
- Регулярное обновление СУБД и библиотек. Устаревшие версии могут содержать уязвимости.
- Использование WAF (Web Application Firewall). Может блокировать подозрительные запросы, но не является панацеей.
- Логирование и мониторинг. Анализ логов помогает вовремя обнаружить попытки вторжения.
Заключение
Строка ")))) AND EXTRACTVALUE(1011,CONCAT(0x7e,((SELECT (ELT(1011=1011,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE для вывода данных через сообщение об ошибке. Понимание механики таких атак помогает разработчикам и администраторам лучше защищать свои системы. Помните, что безопасность — это процесс, а не одноразовое действие. Всегда проверяйте пользовательский ввод, используйте параметризованные запросы и следите за обновлениями.
Комментарии
—Войдите, чтобы оставить комментарий