Loading...
Обучение/Помощь новичкам | Введение в 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 документ, то существует
возможность того
Стасик что ты делаешь прекрати :D
NLMan (04.03.2015 в 00:44)
Стасик что ты делаешь прекрати :D

:D
NLMan (04.03.2015 в 00:44)
Стасик что ты делаешь прекрати :D

Какой Стас?
Anonymous111 (04.03.2015 в 00:52)
NLMan (04.03.2015 в 00:44)
Стасик что ты делаешь прекрати :D

Какой Стас?

Масик :D
ArIzOn , я тут тока сегодня зарегся,незнаю масика
Онлайн: 6
Время:
Gen. 0.0961
(c) Bym.Guru 2010-2026