Введение
В логах веб-серверов, системах обнаружения вторжений или просто в поле ввода на сайте можно встретить загадочные строки, содержащие функции SQL. Одна из таких строк: %"))) AND EXTRACTVALUE(2711,CONCAT(0x7e,((SELECT (ELT(2711=2711,1)))),0x7e))-- -. Что это такое и какова её цель? Это классический пример error-based SQL-инъекции для СУБД MySQL. Подобные запросы используются злоумышленниками для извлечения данных из базы через вывод сообщений об ошибках.
Что такое SQL-инъекция?
SQL-инъекция (SQL injection) — один из самых распространённых способов атаки на веб-приложения. Суть метода заключается во внедрении произвольного SQL-кода в запрос, который приложение отправляет в базу данных. Если входные данные не фильтруются должным образом, злоумышленник может выполнить свой запрос и получить доступ к конфиденциальной информации: логинам, паролям, персональным данным пользователей.
Существует несколько разновидностей SQL-инъекций:
- Union-based — использование оператора UNION для объединения результатов легитимного запроса с данными из других таблиц.
- Error-based — извлечение данных через сообщения об ошибках, которые генерирует база данных.
- Blind SQL injection — когда приложение не выводит ошибки, и атакующий задаёт вопросы базе, получая ответы «да/нет» по времени отклика или изменению контента.
- Time-based — использование функций задержки для определения истинности условий.
Рассматриваемый запрос относится к категории error-based.
Разбор строки: %"))) AND EXTRACTVALUE(2711,CONCAT(0x7e,((SELECT (ELT(2711=2711,1)))),0x7e))-- -
Давайте разберём этот payload по частям.
1. Начало: %")))
Символы %, " и закрывающие скобки ))) — это попытка «закрыть» исходный SQL-запрос, в который внедряется код. Например, если приложение выполняет запрос вида SELECT * FROM users WHERE name = '%")))...', то злоумышленник добавляет свои символы, чтобы разорвать строку и добавить собственную логику. Процент (%) может быть частью URL-кодирования или просто мусором для обхода простых фильтров.
2. AND
Оператор AND присоединяет дополнительное условие к существующему WHERE. Если исходный запрос был истинным, добавление AND с внедрённой функцией заставит базу выполнить её.
3. EXTRACTVALUE(2711, CONCAT(...))
EXTRACTVALUE — это функция MySQL, предназначенная для извлечения значения из XML-документа. Она принимает два аргумента: XML-фрагмент и XPath-выражение. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой отображается переданный XML-фрагмент. Это и есть основа error-based инъекции.
В нашем случае первый аргумент — число 2711 (произвольное число, не являющееся корректным XML). Второй аргумент — результат CONCAT, который содержит специальные маркеры и подзапрос.
4. CONCAT(0x7e, ..., 0x7e)
CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа тильды (~). Тильды используются как маркеры, чтобы в сообщении об ошибке легко было найти извлечённые данные. Внутри CONCAT находится подзапрос (SELECT (ELT(2711=2711,1))).
5. ELT(2711=2711,1)
ELT — функция, возвращающая N-й элемент из списка. Первый аргумент — условие 2711=2711, которое всегда истинно (1). Второй аргумент — 1. Таким образом, ELT(1,1) вернёт 1. Это простейший пример; в реальной атаке вместо 1 может быть подзапрос, извлекающий данные (например, (SELECT password FROM users LIMIT 1)).
6. -- -
Двойной дефис с пробелом — комментарий в SQL. Всё, что идёт после него, игнорируется базой данных. Это нужно, чтобы «отрезать» оставшуюся часть оригинального запроса (например, закрывающую кавычку), которая могла бы вызвать синтаксическую ошибку.
Как работает атака
Когда база данных выполняет этот запрос, функция EXTRACTVALUE получает некорректный XML (число 2711) и пытается применить XPath, содержащий тильды и результат подзапроса. MySQL выдаёт ошибку вида:
XPATH syntax error: '~1~'
В этом сообщении между тильдами отображается результат выполнения подзапроса. Если вместо 1 подставить, например, (SELECT version()), то в ошибке появится версия MySQL. Так злоумышленник может пошагово извлекать любые данные: имена таблиц, столбцов, логины и пароли пользователей.
Зачем это нужно злоумышленнику?
Цель — получить доступ к базе данных. С помощью error-based инъекций можно:
- Определить версию СУБД и её настройки.
- Получить список баз данных, таблиц и столбцов.
- Извлечь учётные данные пользователей (логины, пароли, email).
- В некоторых случаях — выполнить произвольные команды на сервере.
Подобные атаки часто автоматизируются с помощью инструментов вроде SQLmap, которые подбирают payload'ы и извлекают данные в полуавтоматическом режиме.
Как защититься?
Основной способ защиты — использовать параметризованные запросы (prepared statements). Они разделяют код SQL и данные, поэтому внедрение постороннего кода становится невозможным. Дополнительные меры:
- Валидация и фильтрация всех входных данных.
- Экранирование специальных символов.
- Использование ORM или фреймворков, которые автоматически применяют параметризацию.
- Регулярное обновление СУБД и веб-приложений.
- Настройка WAF (Web Application Firewall) для блокировки подозрительных запросов.
Если вы обнаружили в логах подобную строку, это признак того, что ваш сайт пытались взломать. Следует немедленно проверить код на наличие уязвимостей и убедиться, что все запросы к базе данных параметризованы.
Заключение
Строка %"))) AND EXTRACTVALUE(2711,CONCAT(0x7e,((SELECT (ELT(2711=2711,1)))),0x7e))-- - — это не случайный набор символов, а хорошо продуманный эксплойт для error-based SQL-инъекции в MySQL. Понимание принципов его работы помогает разработчикам и специалистам по безопасности своевременно выявлять и предотвращать атаки. Никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы — это золотое правило веб-безопасности.
Комментарии
—Войдите, чтобы оставить комментарий