⚔️XPATH Injection

XPATH Injection Explanation

Где я?

Это страница с дополнительным материалом для студентов, изучающих курс SQL Injection Master.

Материалы на этой странице подробно объясняют, как работает инъекция с помощью ошибки синтаксиса XPATH.

Разбираемся с XPATH syntax error

В блоке номер 8 мы встречаемся с двумя функциями:

  • EXTRACTVALUE(xml_frag, xpath_expr)

  • UPDATEXML(xml_target, xpath_expr, new_xml)

При использовании этих функций в инъекциях нам важен только параметр xpath_expr. Именно с помощью него мы будем вызвать ошибки синтаксиса.

Остальные параметры не имеют для нас значения и их можно заменить на 1, true и тп.

Разбирать принцип работы данной инъекции мы будем на функции EXTRACTVALUE(), инъекция с функцией UPDATEXML() будет работать аналогично.

Начнём наш разбор с простых команд, которые мы будем выполнять в консоли MySQL.

Функция EXTRACTVALUE() используется для извлечения значения из строки XML с использованием нотации XPath

EXTRACTVALUE(xml_frag, xpath_expr)

  • xml_frag - фрагмент разметки XML (по сути строка);

  • xpath_expr - выражение XPath xpath_expr (также известное как локатор, по сути указатель);

Для работы с XML существует определенный синтаксис.

XML элементы должны следовать следующим правилам написания имен:

  • Имена могут содержать буквы, числа и другие символы

  • Имена НЕ МОГУТ начинаться с цифры или символа пунктуации

Если имя ноды начинается с буквы и имеет в себе цифры, то никаких проблем с запросом не будет и запрос будет выполнен без ошибок. Для нас этот вариант не очень интересен

При использовании в имени ноды только цифр мы не получим данных, но и ошибку синтаксиса мы тоже не получим.

Но если имя ноды начинается с цифры (или знака пунктуации\табуляции\пробела и тп) и содержит в себе буквы, то мы получим ошибку XPATH syntax error.

⚠️ Если ошибку вызывают цифры, то они не отображаются в сообщении об ошибке. ⚠️

Однако, если в имени ноды на первом месте использовать пробел (или знаки пунктуации и прочее), то в сообщении об ошибке синтаксиса будут отображены все символы. (С поправкой, что ошибка XPATH отображает только 32 символа!)

Вспоминаем функцию CONCAT()

Теперь немного отступим от инъекции XPATH и быстро освежим в памяти как работает функция CONCAT().

MySQL функция CONCAT() позволяет объединять вместе два или более выражений.

Не забываем, что CONCAT() работает со строками и если мы хотим объединить какие-то данные из таблицы, то нам стоит это сделать с помощью подзапроса, заключенного в круглые скобки

Память освежили, переходим к объединению двух функций!

Используем CONCAT внутри EXTRACTVALUE

Как мы уже определили ранее, первым элементом в xpath_expr нам нужно указать символ вызывающий ошибку, но не цифру!

Мы вызвали ошибку с помощью символа : (В HEX 0x3a это символ двоеточия) и таким образом мы получили в отображении ошибки все символы, без обрезки цифр.

В этом варианте мы вызвали ошибку с помощью символа перевода строки (В HEX 0x0a = \n).

Вот и вся техника, ничего сложного в ней нет! Главное использовать для вызова ошибки "правильные" символы, позволяющие отображать в ошибке числа (я остановил свой выбор на 0x0a), и не забывать, что вывод ограничен в 32 символа.

Если упираемся в лимит по выводу, то дополнительно используем функцию SUBSTRING().

Функция SUBSTRING()

Функция SUBSTRING() извлекает подстроку из строки (начиная с любой позиции).

В MySQL существуют функции с аналогичным функционалом:

  • SUBSTRING()

  • SUBSTR()

  • MID()

Синтаксис у этих функций абсолютно одинаковый - MID(string, start, length)

Я предпочитаю использовать функцию MID(), поскольку сталкивался в проектах, где для инъекции можно было использовать ограниченное количество символов и короткое имя функции MID() меня здорово выручало!

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

Для этого нам необходимо наш подзапрос поместить в круглые скобки!

При работе с этими функциями главное не запутаться в круглых скобках!😉

P.S. Мой всем совет, при работе с XPATH инъекциями - не использовать функции GROUP_CONCAT(), для получения разом всех данных из одной колонки, или функции CONCAT() , для получения данных из разных колонок, одним запросом.

Это может сильно усложнить понимание из какой колонки какие данные были извлечены или создать путаницу с символами в выводе данных.

Лучше используя функцию LIMIT() сделать несколько лишних запросов, зато быть уверенным, что нигде не ошибся!

Заключение

Весь разбор данного типа инъекций мы провели в консоли MySQL, однако этого достаточно, чтобы понять общий принцип работы.

Варианты применений данных инъекций для решения лабораторных заданий очень хорошо расписаны в методических материалах курса.

Если кто-то хочет потренироваться с данным тип инъекций локально, то можно воспользоваться тестовым стендом. [Скачать]arrow-up-right

Если кто-то не доверяет файлам из интернета, то всегда можно проверить код php файла, он предельно простой и в нём нет никаких скрытых закладок!

Всем успехов! BearSec

Last updated