Problem
Jednym z najpotężniejszych narzędzi w rękach napastnika tworzącego exploity XSS jest możliwość generowania żądań do docelowego serwisu WWW z przeglądarki ofiary oraz możliwość czytania przesłanych odpowiedzi. W niniejszej recepturze pokazano, w jaki sposób można wykorzystać JavaScript w celu tworzenia żądań do docelowego serwisu WWW z przeglądarki ofiary.
Rozwiązanie
Utworzono skrypt JavaScript zawierający kod z poniższego listingu, a następnie udostępniono go pod adresem http://napastnik.example.org/tworz_zadanie_http.js (lub dowolnym innym, gdzie znajduje się serwer ataku). Dzięki temu możliwa byłaby publikacja go w serwsie internetowym
Kod JavaScript do tworzenia żądań HTTP var xmlhttpreq;
if (window.XMLHttpRequest){
/* W większości przeglądarek do tworzenia żądań AJAX wykorzystywany jest obiektXMLHttpRequest */ xmlhttpreq=new XMLHttpRequest();
}
else if (window.ActiveXObject) {
/* Internet Explorer do tworzenia żądań AJAX wykorzystuje obiektActiveXObject */ xmlhttpreq=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttpreq.open("GET","http://www.example.com/jakies_operacje",false);
if (window.XMLHttpRequest){ xmlhttpreq.send(null);
} else {
xmlhttpreq.send();
}
/* Odpowiedź serwera jest zapisana w zmiennej 'response' */ var response = xmlhttpreq.responseText;
DYSKUSJA
Kod z powyższego listingu przesyła żądanie do docelowego serwisu WWW z przeglądarki ofiary. Odpowiedź jest zapisywana w zmiennej response, gdzie może być parsowana za pomocą JavaScript. Następnie uzyskane informacje mogą być przesłane do napastnika tak jak w poprzednich dwóch recepturach lub użyte w kolejnych żądaniach przesyłanych do docelowego serwisu WWW. Na przykład jeśli napastnik znajdzie wrażliwość na ataki XSS w aplikacji banku internetowego, może napisać kod JavaScript przesyłający żądanie do tego serwisu, odczytać z odpowiedzi numery rachunków, a następnie użyć ich w celu zainicjowania przelewu na swój rachunek bankowy.
Taki atak zadziała, ponieważ przeglądarka ofiary przesyła plik cookie sesji użytkownika razem z każdym żądaniem do wrażliwego serwisu. Wrażliwy serwis WWW uwierzytelnia każde z żądań poprzez weryfikację pliku cookie sesji użytkownika. Nie jest w stanie odróżnić żądań zainicjowanych przez prawowitego użytkownika od żądań wygenerowanych za pomocą kodu JavaScript napastnika.
Pokazany atak działa tylko wtedy, gdy docelowy serwis WWW jest wrażliwy na ataki XSS. Choć istnieje możliwość przesyłania żądań do dowolnego serwisu WWW za pomocą ataków CSRF odczytywanie odpowiedzi serwera i wykorzystywanie informacji w nich przesyłanych jest możliwe tylko wtedy, gdy docelowy serwis jest wrażliwy na ataki XSS. Jest tak, ponieważ przeglądarki WWW wymuszają politykę „tego samego źródła" (ang. same origin policy), która zezwala na wysyłanie żądań AJAX tylko do takich serwisów WWW, które użytkownik odwiedził. Dzięki zastosowaniu podanej techniki skrypt napastnika może naśladować dowolne działanie dostępne dla prawowitego użytkownika.