Меню
Назад » »

Внедрение операторов XPath (XPath Injection)

Внедрение операторов XPath (XPath Injection)

Эти атаки направлены на вебсерверы, создающие запросы на языке XPath на основе данных, вводимых пользователем.

Язык XPath 1.0 разработан для предоставления возможности обращения к частям документа на языке XML. Он может быть использован непосредственно либо в качестве составной части XSLT‑преобразования XML‑документов или выполнения запросов XQuery.

Синтаксис XPath близок к языку SQL‑запросов. Предположим, что существует документ XML, содержащий элементы, соответствующие именам пользователей, каждый из которых содержит три элемента – имя, пароль и номер счета. Следующее выражение на языке XPath позволяет определить номер счета пользователя "jsmith" с паролем "Demo1234":

String(//user[name/text()='jsmith' and

password/text()='Demo1234']/account/text())

Если запросы XPath генерируются во время исполнения на основе пользовательского ввода, у атакующего появляется возможность модифицировать запрос с целью обхода логики работы программы. Для примера предположим, что веб‑приложение использует XPath для запросов к документу XML для получения номеров счетов пользователей, чьи имена и пароли были переданы клиентом. Если это приложение внедряет данные пользователя непосредственно в запрос, это приводит к возникновению уязвимости (листинг 1.13).

Листинг 1.13. Код, реализующий уязвимость посредством оператора XPath

XmlDocument XmlDoc = new XmlDocument();

XmlDoc.Load("…");

XPathNavigator nav = XmlDoc.CreateNavigator();

XPathExpression expr =

nav.Compile("string(//user[name/text()='"+TextBox1.Text+"'

and password/text()='"+TextBox2.Text+

"']/account/text())");

String account=Convert.ToString(nav.Evaluate(expr));

if (account=="") {

// name+password pair is not found in the XML document

// login failed.

} else {

// account found ‑> Login succeeded.

// Proceed into the application.

}

В случае использования подобного кода злоумышленник может внедрить в запрос выражения на языке XPath, например ввести в качестве имени пользователя следующее выражение:

' or 1=1 or ''='

В этом случае запрос всегда будет возвращать счет первого пользователя в документе, поскольку будет выглядеть следующим образом:

string(//user[name/text()='' or 1=1 or ''='' and

password/text()='foobar']/account/text())

В результате злоумышленник получит доступ в систему от имени первого в XML‑документе пользователя, не предоставляя имени пользователя и пароля.

Разглашение информации

Атаки данного класса направлены на получение дополнительной информации о веб‑приложении. Используя эти уязвимости, злоумышленник может определить используемые дистрибутивы ПО, номера версий клиента и сервера и установленные обновления. В других случаях в утекающей информации может содержаться расположение временных файлов или резервных копий. Во многих ситуациях эти данные не требуются для работы пользователя. Большинство серверов предоставляют доступ к чрезмерному объему данных, однако необходимо минимизировать объем служебной информации. Чем большими знаниями о приложении будет располагать злоумышленник, тем легче ему будет скомпрометировать систему.
Никто не решился оставить свой комментарий.
Будь-те первым, поделитесь мнением с остальными.
avatar