Atak typu CSRF (cross site request forgery) polega na wykorzystaniu ogólno przyjętej logiki działania przeglądarek internetowych dotyczących zarządzania sesją użytkownika w otwartych stronach. Standardem jest, że użytkownik może posiadać tylko jedną aktywną sesję w aplikacji internetowej z której aktualnie korzysta. Każda nowo otwarta karta w przeglądarce będzie automatycznie korzystać z ciasteczek użytkownika już zalogowanego. Atakujący wykorzystuje ten fakt najczęściej podsyłając swojej ofierze specjalnie przygotowany link po kliknięciu w który zostanie wywołana akcja (np. zmiany hasła) na stronie w której ofiara posiada aktywną sesję.
Zabezpieczenie przed tego typu atakiem polega najczęściej na dodaniu specjalnego unikalnego i nieprzewidywalnego, co najmniej per sesja parametru, który jest doklejany jako zmienna do wrażliwych żądań (np. zmiana hasła, dodanie nowego użytkownika) i którego poprawność jest weryfikowana przez serwer. Atakujący nie znając wartości tego tokenu nie jest w stanie wygenerować żądania którego serwer nie odrzuci ze względu na brak zgodności tokenu antiCSRF.
W jednej z badanych przeze mnie aplikacji odkryłem możliwość przeprowadzenia wielu ataków typu CSRF. Jednym z przykładów jest przygotowanie odpowiedniej spreparowanej strony po wejściu na którą przez zalogowanego użytkownika, zostanie w jego imieniu wykonane żądanie zmieniające hasło. Poniżej zaprezentowany został kod tej strony wraz z zaznaczonymi parametrami odpowiadającymi za nadanie nowego hasła. Zauważyć należy, iż w zaznaczonej linii na poniższym wydruku wskazany został kod definiujący pole formularza typu input, gdzie zdefiniowany zostało nowe hasło.
Automatycznie wysłane żądanie wykorzystujące sesje użytkownika, który wszedł na podstawioną stronę wygląda jak poniżej:
Host: XXXXX
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
[…]
-----------------------------70124987214088125821572825923
Content-Disposition: form-data; name="newpassword"
csrf
[…]
W odpowiedzi aplikacja potwierdza zmianę hasła co jest widoczne na poniższym zrzucie ekranu: