Веб-приложения хранят данные и получают доступ к ним различными способами и формами в зависимости от их вариантов использования. Исторически реляционные базы данных были популярным выбором среди других баз данных для хранения больших объемов данных. Однако растет тенденция к использованию XML для хранения данных. При использовании XML данные хранятся во вложенной структуре в виде деревьев, а не столбцов и строк. У этого есть много недостатков, но его можно использовать для статических данных, таких как параметры конфигурации. Это связано с тем, что такие статические данные требуют меньше операций чтения / записи, что очень медленно в базах данных XML.
Что такое XPath?
Данные, хранящиеся в XML, можно запрашивать через XPath, который концептуально аналогичен SQL. Это также язык запросов, который используется для поиска определенных элементов в XML-документе. Нет разрешений уровня доступа, и можно ссылаться практически на любую часть XML-документа, в отличие от SQL, который допускает ограничения на базы данных, таблицы или столбцы.
Что такое внедрение XPath?
Проблемы, которые могут возникнуть при хранении данных с использованием XML, также похожи на проблемы, возникающие в SQL. Внедрение XPath - это тип атаки, при которой злонамеренный ввод может привести к несанкционированному доступу или раскрытию конфиденциальной информации, такой как структура и содержимое XML-документа. Это происходит, когда ввод пользователя используется при построении строки запроса. Большое количество методов, которые можно использовать в атаке с использованием SQL-инъекции, зависят от характеристик диалекта SQL, используемого целевой базой данных, тогда как внедрение XPath атаки могут быть гораздо более адаптируемыми и повсеместными.
Рассмотрим следующий сценарий.
Веб-сайт использует XML для хранения учетных данных пользователей и другой информации. XML-документ выглядит следующим образом:
<?xml version=”1.0" encoding="utf-8"?> <Employees> <Employee ID="1"> <Name>Sam</Name> <UserName>Johns</UserName> <Password>This is Secret</Password> </Employee> <Employee ID="2"> <Name>Peter</Name> <UserName>Pan</UserName> <Password>Ssssshh</Password> </Employee> </Employees>
Для входа на сайт пользователь вводит логин и пароль. Следовательно, запрос XPath, созданный для запроса данных, будет следующим:
"//Employee[UserName/text()='" & Request("UserName") & "' And Password/text()='" & Request("Password") & "']"
Если мы вставим вредоносную полезную нагрузку в качестве имени пользователя, сгенерированный запрос XPath будет следующим:
Username : test' or 1=1 or 'a'='a Password : test XPath Query: //Employee[UserName/text()='test' or 1=1 or 'a'='a' And Password/text()='test'] This is equivalent to: //Employee[(UserName/text()='test' or 1=1) or ('a'='a' And Password/text()='test')]
Таким образом, первая часть запроса выполняется, а вторая часть игнорируется. Пароль становится неактуальным, и злоумышленник получает несанкционированный доступ к сайту.
В дополнение к приведенному выше примеру можно также получить весь XML-документ с помощью B oolenization и XMLCrawling, что обычно называется слепое внедрение XPath . Сервер возвращает True, если злоумышленник успешно входит на сайт, и False в случае сбоя. Можно определить количество узлов, идентифицируя данные в XML-документе, используя различные подфункции XPath. Вот некоторые из подфункций:
Returns the number of nodes: count(//user/child::node() Checks if the password node has 6 characters string-length(//user[position()=1]/child::node()[position()=3])=6
Как это предотвратить?
- Пользовательский ввод необходимо очистить, например, quote (‘) можно заменить на « ». Проверка должна быть добавлена как на стороне клиента, так и на стороне сервера.
- Мы можем использовать параметризованные запросы (например, подготовленные операторы в SQL), в которых запросы предварительно скомпилированы, а пользовательский ввод передается как параметры, а не выражения.
"//users[LoginID/text()= $LoginID and passwd/text()= $password]"
- Должны использоваться правильные страницы ошибок, которые не раскрывают никакой информации во время ошибки, которая может принести пользу злоумышленнику.
Отказ от ответственности: информация, опубликованная в этой статье, предназначена только для образовательных целей. Содержание этой статьи основано на моих личных знаниях и опыте. Автор не несет ответственности за неправомерное использование информации.