Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Введение в XPath инъекции |

25.06.2008, 20:25
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Введение в XPath инъекции
Введение в XPath инъекции
Что такое 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 база и аутентификация, основанная на ней:
PHP код:
<?xml version='1.0' encoding='ISO-8859-1'?> <users>
<user>
<id> 1 </id>
<username> admin </username>
<password> xp8th! </password>
</user>
<user>
<id> 2 </id>
<username> test </username>
<password> test987 </password>
</user>
<user>
<id> 3 </id>
<username> bigolnerd </username>
<password> nerdsneedlovetoo </password>
</user>
</users>
Код, реализующий атуентификацию:
PHP код:
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!". В таком случае запрос будет такой:
PHP код:
//users[username/text()='admin' and password/text()='xp8th!'] /id/text()
Никаких проверок не производится и можно применить давно знакомый нам подход использовав ' или '1'='1;
PHP код:
//users[username/text()='admin' and password/text()='' or '1'='1' ]/id/text()
Запрос вернет ID для пользователя admin с пустым паролем или при условии 1=1, что всегда истина.
Пример 2
Представим, что у нас есть такой документ:
PHP код:
<?xml version="1.0" encoding="utf-8" ?>
<orders>
<customer id="1">
<name>Bob Smith</name>
<email>bob.smith@bobsmithinc.com</email>
<creditcard>1234567812345678</creditcard>
<order>
<item>
<quantity>1</quantity>
<price>10.00</price>
<name>Sprocket</name>
</item>
<item>
<quantity>2</quantity>
<price>9.00</price>
<name>Cog</name>
</item>
</order>
</customer>
...
</orders>
Сайт позволяет пользователю осуществлять поиск по своим предыдущим заказм по цене. XPath запрос в приложении выглядит примерно так:
PHP код:
string query = "/orders/customer[@id='" + customerId + "']/order/item[price >= '" + priceFilter + "']";
Если оба поля customerId и priceFilter не проверяются на ввод, атакующий может использовать инъекцию. Введя следующие значения нападающий получит весь XML документ:
'
Запрос будет выглядеть так:
PHP код:
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:
Ссыль
Руководство XPath:
Ссылка
Предотвращение XPath инъекций:
Ссыль
Статья с Xakep.ru
Автор -=Jul=-
Последний раз редактировалось Bloodmoon; 25.06.2008 в 21:44..
|
|
|

25.06.2008, 20:29
|
|
Постоянный
Регистрация: 22.04.2006
Сообщений: 566
Провел на форуме: 1325772
Репутация:
517
|
|
почему ссылка про .нет зафорбидена?
|
|
|

25.06.2008, 20:35
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Сообщение от Talisman
почему ссылка про .нет зафорбидена?
Не паникуй,всё норм 
|
|
|

25.06.2008, 20:36
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Если есть какие пожелания по редактированию,пишите,стат ейка полезная,многим пригодится 
|
|
|

25.06.2008, 20:51
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
Хоть один живой пример то есть?
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
|
|
|

25.06.2008, 21:05
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Сообщение от Qwazar
Хоть один живой пример то есть?
Это поверхностная статья,примеров пока нет,теория ток 
|
|
|

25.06.2008, 21:10
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Только я не вижу фиолетовый цвет?
Напишите статью, о том как использовать кнопку "Предварительный просмотр"
|
|
|

25.06.2008, 21:21
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Сообщение от Fata1ex
Только я не вижу фиолетовый цвет?
Напишите статью, о том как использовать кнопку "Предварительный просмотр"
Так норм???
|
|
|

25.06.2008, 21:25
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Да!!!
|
|
|

25.06.2008, 21:29
|
|
Banned
Регистрация: 09.05.2008
Сообщений: 160
Провел на форуме: 1225102
Репутация:
500
|
|
Сообщение от Fata1ex
Да!!!
Юзай наздоровье 
Если ещё чё найдёшь,пиши 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|