Что такое XPath инъекции? Данные могут хрнаиться в XML файлах всесто баз данных. Для \"общения\" с XML документами был разработан язык XPath. Спецификации его не возбраняется сыскать тут:
http://www.w3.org/TR/xpath.
XPath - язык запросов для XML документов, в общем схожий на SQL для баз данных. Правда вместо таблиц, колонок и строчек XPath оперирует нодами в XML дереве. Но аналогично SQL, XPath может быть уязвим для инъекции в случае в случае введенные данные мало проверяются на стороне сервера.
В чем угроза XPath инъекций?
XPath 1.0 - стандартный язык в отличии от SQL, что имеет уймище \"диалектов\", основанных на сравнительно слабом синтаксисе.
XPath 1.0 позволяет заполучить все объекты базы (XML объяекты). В SQL во многих случаях мы не можем простым SELECT достигнуть до всех объектов базы данных.
XPath 1.0 не имеет разграничений прав для доступа к базе данных в то час как в SQL кое-какие части БД могут быть недоступны из-за недостатка прав.
Пример 1
Представим что у нас есть XML база и аутентификация, основанная на ней:
1
admin
xp8th!
2
test
test987
3
bigolnerd
nerdsneedlovetoo
Код, реализующий атуентификацию:
String username = req.getParameter(\"username\');
String password = req.getParameter(\"password\');
XPathFactory factory = XPathFactory.newInstance();
Xpath xpath = factory.newXPath();
File file = new File(\"/usr/webappdata/users.xml\');
InputSource src = new InputSource(new FileInputStream(file));
XPathExpression expr = xpath.compile(\"//users[username/text()=\' \" +
username + \" \' and password/text()=\' \" + password + \' \']/id/text()\');
String id = expr.evaluate(src);
Этот код загружает XML протокол и запросом получает из него ID, привязанный к введенному пользователем логину и паролю. Предположим это \"admin\" и \"xp8th!\". В таком случае запрос будет такой:
//users[username/text()=\'admin\' and password/text()=\'xp8th!\'] /id/text()
Никаких проверок не производится и не возбраняется применить давнехонько знакомый нам подход использовав \' либо \'1\'=\'1;
//users[username/text()=\'admin\' and password/text()=\'\' or \'1\'=\'1\' ]/id/text()
Запрос вернет ID для пользователя admin с пустым паролем либо при условии 1=1, что завсегда правда.
Пример 2
Представим, что у нас есть таковый документ:
Bob Smith
bob.smith@bobsmithinc.com
1234567812345678
1
10.00
Sprocket
2
9.00
Cog
...
Сайт позволяет пользователю осуществлять розыск по своим предыдущим заказм по цене. XPath запрос в приложении выглядит на глаз так:
string query = \"/orders/customer[@id=\'\" + customerId + \"\']/order/item[price >= \'\" + priceFilter + \"\']\";
Если оба поля customerId и priceFilter не проверяются на ввод, атакующий может применять инъекцию. Введя следующие значения нападающий получит весь XML документ:
\'] | /* | /foo[bar=\'
Запрос будет смотреться так:
string query = \"/orders/customer[@id=\'\'] | /* | /foo[bar=\'\']/order/item[price >= \'\" + priceFilter + \"\']\";
Одним простым запросом мы получаем всю базу данных.
Зачем применять XML вместо баз данных?
Многие XML приложения используют XML дампы баз данных. Идея сосотоит в том, что позволительно ВСЕ ЧТО УГОДНО поместить в XML и опосля применять приложение либо кое-какой код для парсинга тех данных, которые вам необходимы (В частности, к примеру, на Хакере XML базы применяются для разгрузки занятого SQL сервера. Сформировав дампы мы перенесли проблему получения нужных данных со сложных и тяжелых SQL запросов на файловую систему и легкое читка XML файлов.) Проблема же в том, что нет никакого контроля над уровнем доступа и в случае ваше приложение либо код читает XML протокол, то существует вероятность того, что ЛЮБЫЕ данные в нем могут быть просмотрены.
Если ваш сайт использует XML документы для хранения данных и пользовательский ввод употребляется для построения запросов, то целиком быть может, что он уязвим для XPath инъекции.
Защита от XPath инъекций
Лучший тракт это, разумеется, прямые руки разработчиков - ревизия всех полученных от пользователя данных на ошибочные символы и слова.Наиболее оптимально сотворить список разрешенных символов, в частности для ввода номера кредитной карты это будут цифры от 0 до 9, для, в частности, имен - только буквы. Второй технология - параметризация зарпосов. Вместо того, что бы составлять строку запроса в приложении на лету, динамически, целесообразнее сотворить прекомпелированный запрос и уже отдавать переменные не выражениями, а параметрами.
Ссылки
Борьба с XPath инъекциями в .NET:
http://www.tkachenko.com/blog/archives/000385.html
Руководство XPath:
http://www.w3schools.com/xpath/
Предотвращение XPath инъекций:
http://www.ibm.com/developerworks/xml/l ... ction.html
-=Jul=- at xakep.ru
BigBear