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

Строка `) AND EXTRACTVALUE(9543,CONCAT(0x7e,((SELECT (ELT(9543=9543,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (SQL-инъекция, основанная на ошибках). Она предназначена для внедрения в уязвимый SQL-запрос с целью получения информации из базы данных через сообщения об ошибках.

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Они не являются случайным набором символов — это осмысленный код, эксплуатирующий недостатки валидации пользовательского ввода.

Как работает error-based SQL-инъекция?

Основная идея error-based инъекции — заставить базу данных выдать сообщение об ошибке, которое содержит полезные для атакующего данные. В MySQL для этого часто используются функции EXTRACTVALUE() и UPDATEXML(). Они предназначены для работы с XML, но при передаче некорректного XML-фрагмента возвращают ошибку, в тексте которой отображается переданное значение.

Разбор строки по частям

  • `) — закрывающая скобка и обратный апостроф. Это попытка «закрыть» исходный SQL-запрос, чтобы внедрить свой код. Символ ` (backtick) в MySQL используется для экранирования имён таблиц и столбцов. Атакующий предполагает, что уязвимый запрос имеет вид SELECT ... WHERE id = ('...'), и закрывает его.
  • AND — логический оператор, позволяющий присоединить дополнительное условие.
  • EXTRACTVALUE(9543, CONCAT(0x7e, ((SELECT (ELT(9543=9543,1)))), 0x7e)) — вызов функции EXTRACTVALUE с двумя аргументами. Первый аргумент — произвольное число (9543). Второй — результат конкатенации: 0x7e — это шестнадцатеричное представление символа ~ (тильда). Внутри — подзапрос SELECT (ELT(9543=9543,1)).
  • ELT(9543=9543,1) — функция ELT(N, str1, str2, ...) возвращает строку с номером N. Здесь 9543=9543 — это логическое выражение, которое всегда истинно (1). Таким образом, ELT(1, 1) вернёт строку '1'. Это простейшая проверка, что инъекция работает.
  • -- - — комментарий в SQL. Всё, что идёт после --, игнорируется базой данных. Пробел после -- обязателен в некоторых СУБД, поэтому часто пишут -- - или --+.

В результате выполнения такого запроса MySQL попытается обработать XML-фрагмент ~1~, что вызовет ошибку вида: XPATH syntax error: '~1~'. Если вместо 1 подставить, например, имя базы данных, то оно отобразится в ошибке.

Зачем это нужно атакующему?

Цель — получить доступ к данным, которые не должны быть видны. Error-based инъекция позволяет пошагово извлекать информацию: имена таблиц, столбцов, логины и пароли пользователей. Каждый запрос возвращает небольшую порцию данных (до 32 символов из-за ограничения EXTRACTVALUE), поэтому для получения длинных строк используются функции SUBSTR() или LIMIT.

Например, чтобы узнать имя текущей базы данных, атакующий может выполнить:

) AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -

В ответе об ошибке он увидит имя базы. Далее — таблицы, столбцы и так далее.

Почему это опасно?

SQL-инъекции — одна из самых распространённых уязвимостей веб-приложений. Согласно отчёту OWASP, инъекции входят в топ-10 критических рисков. Успешная эксплуатация может привести к:

  • утечке конфиденциальных данных (персональные данные, пароли, номера карт);
  • полному захвату базы данных;
  • нарушению целостности информации (изменение или удаление записей);
  • отказу в обслуживании.

Особенно опасны error-based инъекции, потому что они не требуют сложных условий — достаточно, чтобы приложение выводило сообщения об ошибках СУБД пользователю.

Как защититься?

Основной метод — использование параметризованных запросов (prepared statements). Они разделяют код SQL и данные, поэтому пользовательский ввод никогда не интерпретируется как часть запроса. Дополнительные меры:

  • валидация и фильтрация всех входных данных;
  • экранирование специальных символов с помощью функций СУБД;
  • отключение вывода подробных сообщений об ошибках в production-окружении;
  • применение веб-фаервола (WAF) для блокировки подозрительных запросов;
  • регулярное обновление СУБД и фреймворков.
Важно: даже если сайт не использует MySQL, аналогичные атаки возможны и на других СУБД (PostgreSQL, MSSQL, Oracle). Поэтому защита должна быть комплексной.

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

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

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

Если же вы просто пользователь и увидели такую строку в поле ввода на сайте — это, скорее всего, чья-то попытка взлома, и лучше сообщить администрации ресурса.

Заключение

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

Источники