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

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

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

Как работает эта инъекция?

Разберём по частям:

  • %' — закрывает строковый литерал в исходном SQL-запросе и добавляет процент как часть LIKE-условия (часто используется для обхода фильтров).
  • AND EXTRACTVALUE(7748, CONCAT(0x7e, ((SELECT (ELT(7748=7748,1)))), 0x7e)) — вызывает функцию EXTRACTVALUE(), которая извлекает значение из XML. Если второй аргумент не является корректным XPath-выражением, MySQL генерирует ошибку XPATH syntax error и выводит переданную строку.
  • 0x7e — это шестнадцатеричное представление символа ~ (тильда). Он используется как маркер, чтобы в сообщении об ошибке было легко найти выведенные данные.
  • ELT(7748=7748,1) — функция ELT() возвращает N-й элемент из списка. Здесь условие 7748=7748 всегда истинно (1), поэтому возвращается первый элемент — число 1. Это простейший пример; на практике вместо 1 подставляют подзапрос, извлекающий нужные данные (например, имя пользователя, хеш пароля).
  • -- - — комментарий, который отсекает оставшуюся часть оригинального запроса.

В результате сервер возвращает ошибку вида: XPATH syntax error: '~1~'. Злоумышленник видит, что инъекция работает, и может заменить 1 на подзапрос, чтобы извлечь любые данные.

Зачем это нужно злоумышленнику?

Error-based SQL-инъекции позволяют быстро получить информацию из базы данных, когда другие методы (UNION, blind) не работают или требуют много запросов. Основные цели:

  • Получение версии СУБД, имени базы, пользователя.
  • Извлечение таблиц и колонок из information_schema.
  • Кража конфиденциальных данных: логинов, паролей, персональной информации.

Подобные строки часто автоматически генерируются инструментами вроде sqlmap при тестировании на проникновение.

Пример эксплуатации

Допустим, есть уязвимый параметр id в URL: http://site.com/page.php?id=1. Злоумышленник может подставить:

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

В ответе сервера появится ошибка с именем текущей базы данных. Аналогично можно извлечь любую другую информацию.

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

Основные меры профилактики:

  1. Используйте подготовленные выражения (prepared statements) с параметризацией — это самый надёжный способ.
  2. Применяйте ORM (например, Doctrine, Hibernate), которые автоматически экранируют данные.
  3. Валидируйте и фильтруйте входные данные, особенно те, что попадают в SQL-запросы.
  4. Ограничьте права пользователя БД: не давайте ему доступ к information_schema без необходимости.
  5. Отключите вывод подробных ошибок на продакшене — это затруднит эксплуатацию error-based инъекций.
  6. Регулярно обновляйте СУБД и используйте WAF для блокировки подозрительных запросов.

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

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

  • Не уязвим ли ваш код к SQL-инъекциям (проведите аудит).
  • Установлены ли обновления безопасности.
  • Включите логирование и мониторинг подозрительной активности.
  • Обратитесь к специалистам по информационной безопасности, если не уверены в своих силах.

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

Источники