Что это за строка?

Строка ))) 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) для блокировки подозрительных запросов.
  • Регулярный аудит кода и логов на предмет попыток инъекций.

Что делать, если вы нашли такую строку в логах?

Если вы обнаружили подобную запись в логах, это означает, что кто-то пытался проэксплуатировать уязвимость. Необходимо:

  1. Проверить, не была ли атака успешной (искать необычные ошибки, изменения в данных).
  2. Убедиться, что все запросы к БД используют параметризацию.
  3. Обновить CMS и библиотеки до последних версий.
  4. Настроить оповещения о подобных инцидентах.

Помните: даже если атака не удалась, она указывает на потенциальную уязвимость, которую нужно устранить.

Заключение

Строка ))) AND EXTRACTVALUE(1660,CONCAT(0x7e,((SELECT (ELT(1660=1660,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка SQL-инъекции. Понимание её структуры помогает специалистам по безопасности распознавать угрозы и правильно реагировать. Всегда используйте параметризованные запросы и следите за обновлениями систем.

Источники

  • SQL Injection — Wikipedia