Что это за строка?
Строка ')))) AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e))-- - представляет собой фрагмент SQL-кода, используемый в атаках типа SQL-инъекция (SQL injection). Она предназначена для внедрения в уязвимый параметр веб-приложения, чтобы выполнить произвольный запрос к базе данных MySQL и получить информацию об её структуре или содержимом.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Их основная цель — обойти фильтрацию и заставить СУБД выполнить вредоносные инструкции.
Разбор компонентов инъекции
Рассмотрим каждый элемент подробнее.
1. Закрывающие скобки и кавычки
Начало строки ')))) нужно для того, чтобы «закрыть» существующий SQL-запрос, который формируется в уязвимом приложении. Например, если исходный запрос выглядит как SELECT * FROM users WHERE id = ('$input'), то вставка ')))) разрывает строку и добавляет логические условия.
2. Оператор AND и функция EXTRACTVALUE
AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e)) — это внедряемое выражение. EXTRACTVALUE() — встроенная функция MySQL, которая извлекает значение из XML-документа. Она принимает два аргумента: XML-строку и XPath-выражение. Если XPath-выражение некорректно, функция выдаёт ошибку, содержащую результат вычисления переданного выражения. Это позволяет злоумышленнику получить данные через сообщение об ошибке (техника error-based SQL injection).
3. CONCAT и шестнадцатеричные литералы
CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричное представление символа тильды (~). Тильда используется как разделитель, чтобы облегчить извлечение результата из текста ошибки.
4. Подзапрос с ELT
(SELECT (ELT(2603=2603,1))) — это подзапрос, который возвращает значение. ELT() — функция MySQL, возвращающая N-й элемент из списка. В данном случае ELT(2603=2603,1) проверяет условие 2603=2603 (истинно) и возвращает первый элемент — число 1. Это простой тест, чтобы убедиться, что инъекция выполняется. В реальных атаках вместо этого подзапроса может быть запрос к таблицам базы данных, например, SELECT password FROM users LIMIT 1.
5. Комментарий в конце
-- - — это комментарий, который «отрезает» оставшуюся часть исходного SQL-запроса, чтобы синтаксис стал корректным. Пробел после двух дефисов обязателен в MySQL.
Как работает атака?
Когда уязвимое приложение подставляет пользовательский ввод в SQL-запрос без должной очистки, внедрённая строка меняет логику запроса. Например, исходный запрос:
SELECT * FROM articles WHERE id = '1'
После подстановки вредоносной строки запрос может выглядеть так:
SELECT * FROM articles WHERE id = '1')))) AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e))-- -'
База данных пытается выполнить этот запрос. Функция EXTRACTVALUE вызывает ошибку, так как второй аргумент не является корректным XPath. В тексте ошибки будет содержаться значение, возвращённое подзапросом (в данном случае «1»). Злоумышленник, анализируя ответ сервера, может получить эти данные.
В более сложных вариантах вместо ELT(2603=2603,1) подставляется запрос, извлекающий имена таблиц, колонок или конкретные записи (например, логины и пароли).
Зачем используется EXTRACTVALUE?
Функция EXTRACTVALUE часто применяется в error-based SQL-инъекциях, потому что она генерирует ошибку, содержащую результат выполнения вложенного запроса. Это позволяет обойти ситуации, когда приложение не выводит данные напрямую, но отображает сообщения об ошибках СУБД. Аналогично работают функции UPDATEXML и GTID_SUBSET.
Стоит отметить, что начиная с MySQL 5.7.8 функция EXTRACTVALUE объявлена устаревшей, а в MySQL 8.0 удалена. Однако многие устаревшие системы всё ещё используют старые версии, поэтому атака остаётся актуальной.
Как защититься от SQL-инъекций?
Основная мера — использование параметризованных запросов (prepared statements) и хранимых процедур. Никогда не конкатенируйте пользовательский ввод в SQL-запрос. Также рекомендуется:
- Проводить валидацию и санитизацию всех входных данных на стороне сервера.
- Использовать ORM (например, Hibernate, Entity Framework), которые автоматически экранируют опасные символы.
- Ограничить права пользователя базы данных, от имени которого работает приложение (принцип наименьших привилегий).
- Отключить вывод подробных сообщений об ошибках СУБД в production-окружении.
- Регулярно обновлять СУБД и веб-приложения.
- Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Если вы обнаружили подобную строку в логах, это признак того, что ваш сайт пытались взломать. Срочно проверьте код на наличие уязвимостей и проведите аудит безопасности.
Заключение
Строка ')))) AND EXTRACTVALUE(2603,CONCAT(0x7e,((SELECT (ELT(2603=2603,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE для извлечения данных через сообщения об ошибках. Понимание механизма таких атак помогает разработчикам и администраторам своевременно закрывать уязвимости и защищать информацию.
Комментарии
—Войдите, чтобы оставить комментарий