Jakiś czas temu na blogu Security Ninja pojawił się wpis Can you find the vulnerabilities?, teraz dostępne są rozwiązania zadań: Can you find the vulnerabilites? Part Two. Zadania są stosunkowo proste, ale jeśli ktoś jeszcze tego nie robił, proponuję spróbować się chwilę nad nimi zastanowić. Ja natomiast chciałem zwrócić uwagę na jeden konkretny przykład.
Jak można przegapić DOM based XSS
Fragment kodu, o którym mowa to:
var pos=document.URL.indexOf(”name=”)+5; document.write(document.URL.substring(pos,document.URL.length));
Istnieje duża szansa, że w "tradycyjnych" testach z wykorzystaniem local proxy (np. Fiddler) podatność ta nie zostałaby wykryta. Przypominam, że testy takie polegają na modyfikowaniu parametrów przekazywanych do aplikacji i obserwowaniu tego, co aplikacja zwraca.
Dlaczego przypadek ten mógłby zostać pominięty? Dlatego, że aplikacja dla dowolnie różnych wartości parametru name może zwracać dokładnie taką samą treść. Skrypt natomiast pobierze wartość parametru z... no właśnie, skąd?
W przypadku wykorzystania local proxy żądanie wysyłane do serwera jest przechwytywane przez wykorzystane narzędzie, modyfikowane, a następnie wysyłane do serwera. Serwer widzi zmodyfikowane żądanie, przeglądarka generująca żądanie natomiast nic nie wie o wprowadzonych modyfikacjach. W tym przypadku parametr name jest przekazywany w GET, czyli jest częścią adresu URL. Skrypt osadzony na zwracanej stronie odwołuje się (w uproszczeniu) do przeglądarki, odczytuje adres URL i pobiera z niego oryginalną wartość parametru name. Nawet jeśli za pomocą proxy wartość parametru name zmieniliśmy, przykładowo, z Albercik na <script>alert(/XSS/);</script> to ten skrypt z przykładu nic o tym nie wie, wykorzysta oryginalną wartość parametru i wypisze jak gdyby nigdy nic Albercik.
Przykład ten pokazuje, że czasami warto popatrzeć również w kod skryptów działających po stronie klienta. Nie zawsze jest to łatwe, czasami ilość kodu JavaScript dołączanego do strony (aplikacji) jest naprawdę duża, czyli może nie wystarczyć czasu, a w dodatku kod jest "kompresowany", przez co kompletnie nieczytelny (w takich przypadkach korzystam zwykle z Malzilli, Fiddler ma z kolei plugin JavaScript Formatter, ale z niego nie korzystam)...
Tu jedno pytanie/temat do dyskusji - mając do dyspozycji ograniczony czas na czym (i dlaczego właśnie na tym) skupilibyście się? Na części "serwerowej" aplikacji, czy może na skryptach działających po stronie klienta, w przeglądarce?