⚔️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, однако этого достаточно, чтобы понять общий принцип работы.
Варианты применений данных инъекций для решения лабораторных заданий очень хорошо расписаны в методических материалах курса.
Если кто-то хочет потренироваться с данным тип инъекций локально, то можно воспользоваться тестовым стендом. [Скачать]
Если кто-то не доверяет файлам из интернета, то всегда можно проверить код php файла, он предельно простой и в нём нет никаких скрытых закладок!
Всем успехов! BearSec
Last updated