Что такое SQL-инъекция через ExtractValue?

SQL-инъекция — один из самых распространённых способов взлома веб-приложений. Злоумышленники внедряют вредоносный код в SQL-запросы, чтобы получить доступ к базе данных. Error-based SQL-инъекция — это техника, при которой хакер заставляет сервер выдать сообщение об ошибке, содержащее конфиденциальные данные. Функция ExtractValue в MySQL часто используется для таких атак, так как она генерирует ошибки, включающие переданные ей аргументы.

В запросе пользователя: ) OR EXTRACTVALUE(3944,CONCAT(0x7e,((SELECT (ELT(3944=3944,1)))),0x7e))-- - — это классический пример попытки эксплуатации уязвимости. Давайте разберём, как это работает и что можно сделать для защиты.

Как работает ExtractValue в MySQL?

Функция EXTRACTVALUE(XML_document, XPath_expression) извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL возвращает ошибку, в которой отображается переданное выражение. Злоумышленники пользуются этим, чтобы вытащить данные: они подставляют в XPath результат подзапроса, и если результат содержит недопустимые символы, ошибка покажет эти данные.

В приведённом запросе:

  • EXTRACTVALUE(3944, CONCAT(0x7e, (SELECT (ELT(3944=3944,1))), 0x7e))
  • Первый аргумент 3944 — произвольное число, не являющееся корректным XML.
  • Второй аргумент — конкатенация тильды (0x7e), результата подзапроса и снова тильды.
  • Подзапрос SELECT (ELT(3944=3944,1)) возвращает 1, так как условие истинно.
  • Итоговое XPath-выражение: ~1~ — не является валидным XPath, поэтому MySQL выдаст ошибку вида: XPATH syntax error: '~1~'.

Таким образом, атакующий может заменить 1 на любой другой подзапрос, например, (SELECT user()), и получить имя пользователя базы данных в сообщении об ошибке.

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

Предположим, на сайте есть страница product.php?id=1, где параметр id не фильтруется. Злоумышленник может отправить:

product.php?id=1') AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -

Если запрос выполнится, сервер вернёт ошибку с именем текущей базы данных. Затем можно извлекать таблицы, столбцы и данные, используя information_schema.

Например, для получения имён таблиц:

AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1), 0x7e))-- -

Постепенно меняя LIMIT 0,1 на 1,1, 2,1 и так далее, можно выгрузить все таблицы. Аналогично извлекаются столбцы и записи.

Последствия успешной атаки

Error-based SQL-инъекция через ExtractValue позволяет злоумышленнику:

  • Получить доступ к конфиденциальным данным (пароли, персональная информация, платёжные реквизиты).
  • Изменять или удалять данные в базе.
  • Выполнять административные операции, если уязвимый пользователь имеет высокие привилегии.
  • В некоторых случаях — выполнить произвольный код на сервере (при определённых конфигурациях).

Такие атаки часто автоматизируются с помощью инструментов вроде SQLmap, что делает их доступными даже для неопытных злоумышленников.

Как защититься от SQL-инъекций?

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

Дополнительные меры:

  • Экранирование специальных символов — но это менее надёжно, чем параметризация.
  • Ограничение привилегий пользователя БД — не давайте веб-приложению прав на удаление таблиц или доступ к системным схемам.
  • Валидация входных данных — проверяйте, что параметры соответствуют ожидаемому формату (например, число).
  • Использование ORM — современные ORM-библиотеки автоматически применяют параметризацию.
  • Регулярное обновление СУБД — в новых версиях MySQL некоторые опасные функции могут быть отключены или изменены.
  • WAF (Web Application Firewall) — может блокировать попытки инъекций, но не является панацеей.

Важно также отключить вывод подробных ошибок MySQL на продакшене, чтобы сообщения об ошибках не раскрывали структуру базы данных.

Заключение

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

Источники