Що таке XPath ін’єкції? Дані можуть хрнаиться в XML файлах всесто баз даних. Для «спілкування» з XML-документами був розроблений XPath. Специфікації його можна знайти тут: 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
[email protected]
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:

www.tkachenko.com/blog/archives/000385.html

Керівництво:XPath

www.w3schools.com/xpath/

Запобігання XPath ін’єкцій:

www.ibm.com/developerworks/xml/library/x-xpathinjection.html

-=Jul=- at www.xakep.ru