Problem
Atak wstrzykiwania instrukcji XPath (XML Path Language) przypomina wstrzykiwanie instrukcji SQL. Jest to potencjalny słaby punkt aplikacji, które przechowują wrażliwe informacje w plikach XML zamiast w bazie danych. XPath to język służący do pobierania węzłów z dokumentów XML. Najbardziej popularną wersją tego języka jest obecnie XPath 1.0, podczas gdy wersja XPath 2.0 (podzbiór języka XQuery 1.0) jak dotychczas nie jest tak często wykorzystywana. Proste ataki wstrzykiwania, podobne do opisanych w tej recepturze, zadziałają zarówno dla języka XPath 1.0, jak i XPath 2.0. Specyfikacja XPath 2.0 gwarantuje jednak dodatkowe możliwości, którymi mogą być zainteresowani napastnicy. Te dodatkowe własności nie są wymagane do przeprowadzania prostych testów takich jak te, które zostały opisane w niniejszej recepturze. Warto jednak wiedzieć, że jeśli w aplikacji jest stosowany język XPath 2.0, to oddziaływanie exploita może być większe.
Rozwiązanie
W polach wejściowych aplikacji podejrzanej o używanie kwerend XPath należy wstawić ciągi znaków podobne do tych, które pokazano w listingu 12.28. Odpowiedź serwera może zawierać losowy rekord użytkownika, listę wszystkich użytkowników itp. Otrzymanie takiej nietypowej odpowiedzi może oznaczać, że aplikacja jest wrażliwa na wstrzykiwanie instrukcji XPath.
Dane wejściowe do wyszukiwania podatności na wstrzykiwanie instrukcji XPath
or 1=1
1' or ,1,=,1I or '1='1 1" or "1"="1" or "1"="1
Zwróciliśmy uwagę na to, że pokazane dane wejściowe są dość podobne do tych, których używaliśmy do testowania podatności na wstrzykiwanie instrukcji SQL. Aby sprawdzić, czy aplikacja jest wrażliwa na wstrzykiwanie instrukcji XPath lub instrukcji SQL, należy zapytać członków zespołu projektowego, czy do przetwarzania danych wejściowych w wybranym polu są wykorzystywane kwerendy SQL, czy XPath.
Wstrzykiwanie instrukcji XPath wykazuje wiele podobieństw do wstrzykiwania instrukcji SQL i LDAP. Różnice obejmują jedynie składnię kwerend oraz ich potencjalne oddziaływanie. Jeśli do przechowywania wrażliwych informacji zastosowano pliki XML, istnieje prawdopodobieństwo, że aplikacja wykorzystuje XPath do pobierania informacji z plików. W takim przypadku istnieje możliwość zastosowania ataku wstrzykiwania instrukcji XPath w celu pominięcia mechanizmów uwierzytelniania i uzyskania dostępu do poufnych informacji. Ponieważ tester aplikacji może legalnie zdobyć szczegóły implementacyjne aplikacji i użyć ich w celu inteligentnego przeprowadzenia testów, przed wypróbowaniem omawianych tu testów nie zapomnijmy zapytać członków zespołu projektowego w naszej firmie, czy w aplikacji są stosowane zapytania XPath. Warto również uzyskać rzeczywiste zapytania XPath wykorzystywane w aplikacji. To pozwala na łatwe generowanie prawidłowych danych wejściowych do testowania.
W ramach testu przeanalizowaliśmy kod XML z poniższego listingu, którego aplikacja używa do zapisywania nazw użytkowników i haseł.
Plik XML używany do zapisywania danych identyfikacyjnych użytkowników
<?xml version="1.0" encoding="IS0-8859-2"?>
<users>
<user>
<id>1</id>
<username>asethi</username>
<password>secret123</password>
<realname>Amit Sethi</realname>
</user>
<user>
<id>2</id>
<username>admin</username>
<password>pass123</password>
<realname>Administrator<realname>
</user>
</users>
Założyliśmy, że aplikacja przeprowadza uwierzytelnianie użytkowników za pomocą kwerendy XPath zamieszczonej poniżej:
/users/user[username/text()='username' and password/text()='password']/realname/text()
W związku z tym, że kwerenda zwróciła niepusty ciąg znaków, oznaczało to, że uwierzytelnianie przebiegło pomyślnie. W takim przypadku aplikacja wyświetli komunikat „Witaj username".
Skutki stosowania ataków polegających na wstrzykiwaniu kwerend XPath w wielu przypadkach są mniejsze w porównaniu ze wstrzykiwaniem kwerend SQL, ponieważ kwerendy XPath można wykorzystać tylko do czytania informacji z plików XML. Modyfikowanie zawartości magazynu danych za pomocą ataków wstrzykiwania kwerend XPath nie jest możliwe. Tego rodzaju ataki można jednak wykorzystać do pomijania mechanizmów uwierzytelniania oraz w celu uzyskania dostępu do wrażliwych informacji, na przykład haseł.