Что это за строка?
Строка ))) AND EXTRACTVALUE(1660,CONCAT(0x7e,((SELECT (ELT(1660=1660,1)))),0x7e))-- - — это классический пример SQL-инъекции типа error-based. Она используется злоумышленниками для извлечения информации из базы данных через сообщения об ошибках. Встретить её можно в логах веб-сервера, в поле ввода формы или в параметрах URL.
Подобные конструкции часто попадают в отчёты систем безопасности, и многие задаются вопросом: что это и какова её цель? Ответ прост: это попытка заставить СУБД выполнить вредоносный код и вернуть данные в тексте ошибки.
Разбор по частям
Давайте разберём запрос на составляющие, чтобы понять логику атаки.
- ))) — закрывающие скобки. Они нужны, чтобы «закрыть» ранее открытые скобки в оригинальном SQL-запросе, который формирует уязвимое приложение. Это позволяет внедрить свой код без синтаксической ошибки.
- AND — логический оператор, присоединяющий наше условие к исходному запросу. Если исходный запрос был истинным, то добавление
AND ...не изменит результат, но выполнит внедрённую функцию. - EXTRACTVALUE(1660, ...) — функция MySQL, извлекающая значение из XML-фрагмента. Первый аргумент — XML-документ (здесь число 1660, которое интерпретируется как XML), второй — XPath-выражение. Если XPath содержит недопустимые символы, MySQL выдаёт ошибку, в тексте которой отображается переданное значение. Это и есть канал утечки данных.
- CONCAT(0x7e, ..., 0x7e) — конкатенация строк.
0x7e— это шестнадцатеричное представление символа~(тильда). Тильды используются как маркеры, чтобы в сообщении об ошибке легко было найти выведенные данные. - ((SELECT (ELT(1660=1660,1)))) — подзапрос, возвращающий результат функции
ELT().ELT(N, str1, str2, ...)возвращает N-ю строку из списка. Здесь1660=1660— всегда истинное условие, которое даёт 1, поэтомуELT(1,1)вернёт строку «1». Это тестовый запрос, проверяющий, что инъекция работает. В реальной атаке вместо «1» подставляются имена таблиц, колонок или другие данные, полученные из системных таблиц. - -- - — комментарий. В MySQL
--начинает комментарий до конца строки, а пробел после него обязателен. Дефис в конце — просто дополнение, иногда используется для обхода фильтров.
Как работает error-based SQL-инъекция
Error-based — это техника, при которой злоумышленник заставляет базу данных выдать сообщение об ошибке, содержащее полезные данные. В MySQL функции EXTRACTVALUE и UPDATEXML часто используются для этих целей, так как они возвращают ошибку с переданным XPath-выражением.
Пример: если передать в EXTRACTVALUE XPath, содержащий символы, недопустимые в XML, сервер вернёт ошибку вида XPATH syntax error: '~данные~'. Злоумышленник может подставить в XPath результат подзапроса, например, версию базы данных или имя пользователя.
В нашем случае подзапрос возвращает просто «1», что является тестом. Если ошибка появится, значит, инъекция возможна, и можно переходить к извлечению реальных данных.
Зачем нужны ELT и CONCAT?
ELT — это функция выбора элемента по индексу. Она позволяет формировать строку для вывода. В связке с CONCAT и тильдами злоумышленник создаёт уникальную метку, по которой легко найти результат в логе ошибок.
Например, запрос AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e)) выведет версию MySQL в сообщении об ошибке. Наша строка аналогична, но вместо version() используется ELT(1660=1660,1) — это проверка на возможность выполнения подзапросов.
Последствия успешной инъекции
Если приложение уязвимо, злоумышленник может:
- Получить доступ к конфиденциальным данным: логины, пароли, персональные данные пользователей.
- Изменять или удалять информацию в базе.
- Выполнять административные операции, если уязвимый пользователь БД имеет высокие привилегии.
- Использовать сервер для дальнейших атак.
Поэтому важно своевременно обнаруживать и блокировать подобные попытки.
Как защититься
Основной метод защиты — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому внедрение SQL-кода становится невозможным.
Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string. - Ограничение прав пользователя базы данных: не давайте приложению прав на выполнение опасных операций.
- Валидация и фильтрация входных данных на стороне сервера.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Регулярный аудит кода и логов на предмет попыток инъекций.
Что делать, если вы нашли такую строку в логах?
Если вы обнаружили подобную запись в логах, это означает, что кто-то пытался проэксплуатировать уязвимость. Необходимо:
- Проверить, не была ли атака успешной (искать необычные ошибки, изменения в данных).
- Убедиться, что все запросы к БД используют параметризацию.
- Обновить CMS и библиотеки до последних версий.
- Настроить оповещения о подобных инцидентах.
Помните: даже если атака не удалась, она указывает на потенциальную уязвимость, которую нужно устранить.
Заключение
Строка ))) AND EXTRACTVALUE(1660,CONCAT(0x7e,((SELECT (ELT(1660=1660,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка SQL-инъекции. Понимание её структуры помогает специалистам по безопасности распознавать угрозы и правильно реагировать. Всегда используйте параметризованные запросы и следите за обновлениями систем.
Комментарии
—Войдите, чтобы оставить комментарий