Что такое EXTRACTVALUE?
EXTRACTVALUE — это строковая функция в SQL, которая извлекает значение из XML-документа, используя выражение XPath. Она возвращает текстовое содержимое фрагмента XML, соответствующего заданному XPath-выражению. Функция доступна в СУБД, таких как MySQL и MariaDB. Синтаксис: EXTRACTVALUE(xml_frag, xpath_expr). Первый аргумент — строка, содержащая XML-фрагмент, второй — XPath-выражение.
Синтаксис и примеры
Базовый пример:
SELECT EXTRACTVALUE('<a><b>текст</b></a>', '/a/b');Результат: текст. Функция часто используется для парсинга XML-данных, хранящихся в текстовых полях. Однако при работе с ней возникают специфические ошибки.
Ошибки при использовании EXTRACTVALUE
Одна из распространённых проблем — ошибки парсинга при определённых путях XPath. Например, комбинации вида items->docHeader->attribute->@value или items->docHeader->docDetail->@valor могут вызывать ошибки, которые являются багом. В качестве обходного пути можно использовать функцию CAST() внутри CONCAT() или переименовать элементы, например, docHeader.
Также при использовании XSLT-функции fn:concat() внутри XPath в MySQL ExtractValue возвращается строка только с первыми двумя аргументами. Это ограничение следует учитывать.
Использование в SQL-инъекциях
EXTRACTVALUE часто применяется в SQL-инъекциях для извлечения данных из базы. Например, для получения имени таблицы можно использовать следующий payload:
AND EXTRACTVALUE(6678, CONCAT(0x7e, (SELECT column_name FROM information_schema.columns WHERE table_name=0x61646d696e LIMIT 0,1), 0x7e))-- -Здесь 0x61646d696e — hex-значение имени таблицы (admin). Функция возвращает данные, окружённые тильдами (~). Это классический приём для извлечения информации через ошибки.
Пример из запроса
Рассмотрим запрос: ") AND EXTRACTVALUE(6524,CONCAT(0x7e,((SELECT (ELT(6524=6524,1)))),0x7e))-- -. Здесь EXTRACTVALUE вызывается с номером 6524 и XPath, сформированным через CONCAT. Внутри CONCAT используется подзапрос с ELT, который возвращает 1, если условие 6524=6524 истинно. Это типичный пример слепой SQL-инъекции, где результат EXTRACTVALUE может быть использован для проверки условия.
Заключение
EXTRACTVALUE — мощная функция для работы с XML в SQL, но она имеет ограничения и баги. При использовании в инъекциях она позволяет извлекать данные, но требует осторожности. Понимание её синтаксиса и обходных путей помогает как разработчикам, так и специалистам по безопасности.
Комментарии
—Войдите, чтобы оставить комментарий