Что это за строка?
Строка %")))) AND EXTRACTVALUE(4950,CONCAT(0x7e,((SELECT (ELT(4950=4950,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через вывод сообщений об ошибках. В данном случае злоумышленник проверяет возможность внедрения и пытается заставить сервер вернуть результат выполнения вложенного запроса.
Подобные строки часто встречаются в логах веб-серверов, в отчётах систем обнаружения вторжений (IDS) и в учебных материалах по кибербезопасности. Понимание того, как они работают, помогает разработчикам и администраторам защищать приложения.
Разбор по частям
1. Начало: %"))))
Символы %")))) — это попытка «разорвать» исходный SQL-запрос. Злоумышленник предполагает, что приложение подставляет пользовательский ввод в запрос без должной обработки. Комбинация кавычки и закрывающих скобок позволяет завершить оригинальную конструкцию и добавить собственный код. Знак % может быть частью URL-кодирования или просто мусором для обхода простых фильтров.
2. Оператор AND
Логическое «И» используется для того, чтобы внедряемая часть выполнялась только при истинности предыдущего условия. Если исходный запрос возвращает данные, добавление AND с функцией, вызывающей ошибку, заставит сервер выдать сообщение об ошибке, которое и станет каналом утечки информации.
3. Функция EXTRACTVALUE()
EXTRACTVALUE(XML_document, XPath_expression) — встроенная функция MySQL, которая извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку с текстом, содержащим результат вычисления выражения. Именно это свойство и эксплуатируется: злоумышленник передаёт в качестве XPath строку, которая заведомо вызовет ошибку, но перед этим вычислит вложенный подзапрос.
4. CONCAT(0x7e, ..., 0x7e)
0x7e — это шестнадцатеричное представление символа ~ (тильда). Функция CONCAT склеивает тильду, результат подзапроса и ещё одну тильду. Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти границы извлечённых данных. Сообщение об ошибке обычно выглядит так: XPATH syntax error: '~результат~'.
5. Подзапрос (SELECT (ELT(4950=4950,1)))
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(4950=4950,1) — это проверка: если 4950 равно 4950 (всегда истина), то вернуть строку с индексом 1, то есть 1. Фактически это простейший тест, который возвращает число 1. В реальной атаке вместо 1 мог бы быть, например, database(), user() или подзапрос, извлекающий логины и пароли.
6. Комментарий -- -
Два дефиса и пробел (или дефис) — это комментарий в MySQL. Он нужен, чтобы «отрезать» оставшуюся часть оригинального запроса, которая могла бы помешать выполнению внедрённого кода. Пробел после -- обязателен по стандарту MySQL, но часто пишут -- - для надёжности.
Как это работает целиком
Представим уязвимый запрос: SELECT * FROM articles WHERE id = '$id'. Если передать в $id нашу строку, запрос превратится в:
SELECT * FROM articles WHERE id = '%")))) AND EXTRACTVALUE(4950,CONCAT(0x7e,((SELECT (ELT(4950=4950,1)))),0x7e))-- -'Сервер попытается выполнить EXTRACTVALUE с некорректным XPath, что вызовет ошибку. В тексте ошибки будет содержаться значение, возвращённое подзапросом, — в нашем случае 1. Злоумышленник увидит что-то вроде: XPATH syntax error: '~1~'. Это подтверждает, что инъекция работает.
Далее атакующий заменяет 1 на вызовы функций, извлекающих данные, например SELECT database(), SELECT user() или SELECT password FROM users LIMIT 1. Каждый раз результат попадает в сообщение об ошибке.
Зачем это нужно злоумышленнику?
- Проверка уязвимости. Простейший тест с
ELT(4950=4950,1)показывает, что приложение уязвимо к error-based SQLi. - Извлечение данных. Если приложение не выводит данные напрямую, но показывает ошибки БД, этот метод позволяет по кусочкам вытащить любую информацию: имена таблиц, столбцов, хэши паролей.
- Обход фильтров. Использование вложенных функций и шестнадцатеричных литералов помогает обойти простые сигнатурные фильтры.
Опасность и последствия
Error-based SQL-инъекции считаются одними из самых опасных, потому что позволяют относительно быстро получить доступ к конфиденциальным данным. В руках злоумышленника такая техника может привести к утечке персональных данных пользователей, компрометации учётных записей и полному контролю над базой. По данным OWASP, SQL-инъекции остаются в топ-10 угроз веб-приложений на протяжении многих лет.
Как защититься?
- Параметризованные запросы (prepared statements). Самый надёжный способ — использовать подготовленные выражения, где пользовательский ввод передаётся отдельно от SQL-кода. Это исключает возможность внедрения.
- Экранирование специальных символов. Если по каким-то причинам нельзя использовать параметризацию, применяйте функции экранирования, например
mysqli_real_escape_stringв PHP. Но помните, что это менее надёжно. - Отключение вывода ошибок БД. Сообщения об ошибках не должны попадать к пользователю. Логируйте их на сервере, а клиенту показывайте общую страницу ошибки.
- Принцип наименьших привилегий. Учётная запись, от имени которой приложение подключается к базе, должна иметь только необходимые права. Это ограничит ущерб в случае взлома.
- Регулярное обновление и аудит. Следите за обновлениями СУБД и фреймворков, проводите сканирование уязвимостей и код-ревью.
Важно: даже если приложение не показывает ошибки, error-based инъекция может быть использована «слепым» методом, когда злоумышленник анализирует время ответа или другие побочные эффекты. Поэтому защита должна быть комплексной.
Вывод
Строка с EXTRACTVALUE и ELT — это не случайный набор символов, а тщательно сконструированный инструмент для проверки и эксплуатации уязвимости SQL-инъекции в MySQL. Понимание её работы помогает разработчикам осознать важность безопасного кодирования, а специалистам по безопасности — распознавать атаки в логах. Главный урок: никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.
Комментарии
—Войдите, чтобы оставить комментарий