Opis i różnica między atakami XSS i CSRF (Cross-site scripting i Cross-site request forgery)

Ataki XSS i CSRF to obok ataku typu SQL Injection, jedne z najbardziej znanych i popularnych ataków na strony WWW. Skuteczność ich działania jest praktycznie 100%, jeżeli chodzi o strony WWW napisane przez amatorów, którzy nie znają się na zabezpieczaniu stron przed atakami, a nie korzystają z Frameworków, które automatycznie takie zabezpieczenia implementują.

CSRF (Cross-site request forgery)

Kiedy logujemy się na jakąś stronę, to w plikach Cookie zapisywane są dane sesyjne. Jesteśmy cały czas zalogowani, dopóki się nie wylogujemy lub (czasami) zamkniemy okno przeglądarki.

Atak CSRF wykorzystuje właśnie ten fakt. Wyobraźmy sobie teraz sytuację, że jesteśmy zalogowani do jakiejś ważnej strony WWW (np. banku), a ktoś nam wysyła linka wykonującego operację na tej stronie (np. Prezent dla Ciebie). Gdy klikniemy w tego linka to operacja się wykona, gdyż jesteśmy ciągle zalogowani. Atakujący może być jeszcze bardziej przebiegły i nie wyśle nam linka, tylko obrazek, który podczas ładowania wykona tą operację (np. <img src=’http://bank.pl/operacja.php?wyplac=100pln&komu=hackerowi’ />).

Jak strony zabezpieczają się przed tym atakiem? Bardzo prosto. Gdy jakaś strona generuje link (lub przycisk etc.) to generuje od razu token (jednorazowy lub nie) dla tego linku – np. np. <img src=’http://bank.pl/operacja.php?wyplac=100pln&komu=hackerowi&token=123123′ />. Operacja wykona się tylko, gdy token się zgadza. Hacker nie jest teraz w stanie wysłać nam atakującego linka, gdyż nie wie, jaki token został nam wygenerowany prze stronę. Zabezpieczenie to można jednak obejść, gdy strona jest zabezpieczona przed CSRF, ale nie jest przed atakiem typu XSS, o którym poniżej.

XSS (Cross-site scripting)

Atak ten jest bardzo popularny na niezabezpieczonych forach internetowych, albo stronach z systemami komentarzy – ogólnie chodzi o strony, gdzie użytkownicy mogą tworzyć zawartość danej strony. Wykorzystywany jest tutaj fakt, że kod JavaScript może być umieszczony nie tylko w nagłówku strony (czyli w <HEAD>), ale również w sekcji <BODY>. Przeglądarka wykonuje kod JS, gdy tylko napotka znaczniki <SCRIPT> lub nawet bezpośrednio w tagach (np. ).

Atak polega właśnie na tym, że ktoś w komentarzu umieszcza kod JavaScript, który wykona się u nas i może nam namieszać – wysłać jakieś zapytania HTTP za nas, odczytać jakieś niezaszyfrowane dane z pliku Cookie strony, na której został zamieszczony lub przekierować nas na inną stronę. Tak jak napisałem wcześniej, atak XSS może posłużyć do obejścia zabezpieczenia CSRF. Może się tak zdarzyć, gdyż złośliwy skrypt, może odczytać ze strony token zabezpieczający i wykonać złośliwe zapytanie wykorzystując fakt, że jesteśmy zalogowani na danej stronie.

Jak się strony zabezpieczają przed tym atakiem? Ano wszystkie komentarze itp. powinny być escape‘owane, czyli powinny z nich być usuwane (lub zastępwane) wszystkie potencjalnie niebezpieczne symbole jak: < > ‘ & i inne…