Что это за строка?
Встречая в логах или в поле ввода подобную последовательность символов, многие задаются вопросом: что это и какова её цель? Перед нами классический пример SQL-инъекции, нацеленной на извлечение данных из базы данных через ошибки. Строка '))) AND EXTRACTVALUE(6285,CONCAT(0x7e,((SELECT (ELT(6285=6285,1)))),0x7e))-- - представляет собой вредоносный payload, который может быть использован злоумышленником для проверки уязвимости веб-приложения или для получения информации из СУБД.
SQL-инъекция (SQL injection) — один из самых распространённых способов атаки на веб-сайты, при котором злоумышленник внедряет произвольный SQL-код в запрос к базе данных. Если приложение недостаточно фильтрует пользовательский ввод, этот код выполняется на сервере базы данных, что может привести к утечке конфиденциальных данных, изменению или удалению информации.
Разбор payload по частям
Давайте детально разберём каждый элемент этой строки, чтобы понять её назначение.
1. Начальные символы ')))
Последовательность '))) — это попытка закрыть ранее открытые кавычки и скобки в оригинальном SQL-запросе. Например, если приложение формирует запрос вида:
SELECT * FROM users WHERE id = ('$input')
то подставив '))), злоумышленник может нарушить синтаксис и добавить собственные конструкции. Точное количество скобок подбирается экспериментально или на основе анализа кода.
2. AND EXTRACTVALUE(6285,CONCAT(...))
Функция EXTRACTVALUE() в MySQL (до версии 5.7) используется для извлечения значения из XML-документа. Однако она также известна как инструмент для проведения SQL-инъекций, основанных на ошибках (error-based SQL injection). Синтаксис: EXTRACTVALUE(XML_document, XPath_expression).
Если второй аргумент содержит недопустимый XPath-выражение, MySQL генерирует ошибку, в тексте которой может отображаться переданное значение. Это позволяет злоумышленнику извлекать данные из базы, вызывая ошибки с внедрёнными подзапросами.
В нашем payload: EXTRACTVALUE(6285, CONCAT(0x7e, ((SELECT (ELT(6285=6285,1)))), 0x7e)). Число 6285 — произвольный идентификатор, не влияющий на логику. CONCAT объединяет строки: 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как разделитель, чтобы облегчить поиск результата в сообщении об ошибке.
3. SELECT (ELT(6285=6285,1))
Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Если N=1, возвращается первая строка. Выражение 6285=6285 всегда истинно и возвращает 1 (в MySQL TRUE равно 1). Таким образом, ELT(1,1) вернёт строку '1'.
В данном случае подзапрос SELECT (ELT(6285=6285,1)) просто возвращает '1'. Это может быть тестовым запросом для проверки работоспособности инъекции. В реальной атаке вместо '1' мог бы быть подзапрос, извлекающий имя пользователя, хэш пароля или другую конфиденциальную информацию, например: SELECT password FROM users LIMIT 1.
4. Завершение -- -
Двойной дефис -- в SQL обозначает начало комментария. Всё, что идёт после него, игнорируется парсером. Пробел после -- обязателен в некоторых СУБД (в MySQL — да). Дефис в конце -- - часто добавляют для гарантии, что комментарий будет корректно распознан, особенно если после него нет пробела. Это позволяет отсечь остаток оригинального запроса, который мог бы вызвать синтаксическую ошибку.
Как работает атака целиком
Предположим, уязвимый запрос выглядит так:
SELECT * FROM articles WHERE id = '$id'
Злоумышленник передаёт в параметр id нашу строку. После подстановки запрос принимает вид:
SELECT * FROM articles WHERE id = ''))) AND EXTRACTVALUE(6285,CONCAT(0x7e,((SELECT (ELT(6285=6285,1)))),0x7e))-- -'
База данных пытается выполнить этот запрос. Из-за нарушения синтаксиса (лишние скобки) или из-за вызова EXTRACTVALUE с некорректным XPath возникает ошибка. В сообщении об ошибке MySQL может отобразить результат выполнения вложенного подзапроса, обрамлённый тильдами. Например: XPATH syntax error: '~1~'. Злоумышленник, видя такой ответ, понимает, что инъекция возможна, и может заменить '1' на подзапрос, извлекающий нужные данные.
Если приложение не выводит ошибки базы данных пользователю, атакующий может использовать слепые методы (blind SQL injection), анализируя время ответа или логические условия.
Зачем это нужно злоумышленнику?
- Проверка уязвимости: простой payload с ELT(1,1) позволяет быстро определить, обрабатывается ли инъекция и возвращаются ли ошибки.
- Извлечение данных: заменив '1' на подзапрос, можно получить имена таблиц, столбцов, логины, пароли, номера кредитных карт и любую другую информацию.
- Обход фильтров: использование функций EXTRACTVALUE, CONCAT, ELT и шестнадцатеричных литералов помогает обойти простые сигнатуры WAF (Web Application Firewall).
Как защититься от таких атак?
Основной метод защиты — использование параметризованных запросов (prepared statements). В этом случае пользовательский ввод передаётся отдельно от SQL-кода и не может изменить структуру запроса. Например, в PHP с PDO:
$stmt = $pdo->prepare('SELECT * FROM articles WHERE id = :id');
$stmt->execute(['id' => $id]);
Дополнительные меры:
- Экранирование специальных символов с помощью функций типа
mysqli_real_escape_string()(устаревший подход, но всё ещё встречается). - Валидация входных данных: если параметр должен быть числом, приводите его к целому типу.
- Ограничение прав пользователя базы данных: не давайте приложению прав на чтение системных таблиц.
- Использование WAF для блокировки подозрительных запросов.
- Регулярное обновление СУБД и фреймворков, чтобы закрыть известные уязвимости.
Заключение
Строка '))) AND EXTRACTVALUE(6285,CONCAT(0x7e,((SELECT (ELT(6285=6285,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированный эксплойт для проведения SQL-инъекции. Понимание его работы помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения. Если вы встретили подобную строку в логах, это сигнал о попытке взлома, и следует немедленно проверить безопасность вашего сайта.
Комментарии
—Войдите, чтобы оставить комментарий