2015-07-09 16 views
21

Przeczytałem o CSRF oraz o tym, jak stosuje się Nieprawdopodobny wzorzec tokena synchronizatora, aby temu zapobiec. Nie bardzo rozumiałem, jak to działa.Jak token zapobiega atakowi csrf?

Weźmy ten scenariusz:

użytkownik jest zalogowany do witryny z tego formularza:

<form action="changePassword" method="POST"> 
    <input type="text" name="password"><br> 
    <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' > 
</form> 

Serwer przechowuje również token w sesji. Po wysłaniu żądania porównuje token w danych formularza z tokenem w sesji.

Jak to zapobiec CSRF gdy haker może napisać kod JavaScript, który będzie:

  1. wysłać żądanie GET do strony
  2. Otrzymuj tekst HTML zawierającą formularz zgłoszenia.
  3. Wyszukaj tekst w html dla tokenu CSRF.
  4. Złóż złośliwą prośbę, używając tokena.

Brakuje mi czegoś?

Odpowiedz

8

Osoba atakująca nie może użyć kodu JavaScript do odczytania tokena z witryny, ponieważ byłaby to prośba o przesłanie danych, a dostęp do danych z niej jest domyślnie blokowany przez tę samą zasadę pochodzenia (MDN, W3C).

Weź to na przykład:

var xhr = new XMLHttpRequest(); 
 
xhr.open("GET", "http://google.com"); 
 
xhr.addEventListener('load', function (ev) { 
 
    console.log(this.responseText); 
 
}); 
 
xhr.send();

Sprawozdania konsoli JS:

XMLHttpRequest nie może załadować http://google.com/. Na żądanym zasobie nie ma nagłówka "Access-Control-Allow-Origin".

+1

Warto zauważyć, że możesz wydać pomyślny repozytorium GET również przez iframe, skrypt lub tag obiektu, ale przeglądarka nie pozwoli ci uzyskać załadowanej zawartości dokumentu z JavaScript (protokoły, domeny i porty muszą się zgadzać), – pamelus

+0

dziękuję za odpowiedź – david

+0

Jeśli ktoś się zastanawiał, dlaczego atakujący nie może po prostu pobrać starego tokena z witryny i użyć go w swoim żądaniu, to dlatego, że token jest również przechowywany jako plik cookie w przeglądarce, którego atakujący nie zna. , więc kiedy wysyła żądanie z nowym tokenem, który właśnie dostał z witryny, nie pasuje do tego na cookie użytkownika, a prośba została odrzucona. – T0m

-2

Należy zdać sobie sprawę, że ataki CSRF mają miejsce tylko w przeglądarce. Sesja użytkownika z serwerem docelowym jest wykorzystywana przez złośliwy serwer do fałszowania żądań. Więc jak się dzieje # 1? Dwie opcje: możesz wykonać żądanie # 1 ze złośliwego serwera, ale to po prostu zwróci token CSRF dla sesji serwera lub możesz wykonać żądanie # 1 za pomocą AJAX, które, jak poprawnie zidentyfikowałeś, zwróci Token CSRF ofiary user.

Przeglądarki zaimplementowały kontrolę dostępu HTTP właśnie z tego powodu. Musisz użyć nagłówka Access-Control-Allow-Origin, aby ograniczyć domeny, które mogą wysyłać żądania AJAX do twojego serwera. Innymi słowy, twój serwer zapewni, że przeglądarka nie pozwoli złośliwemu serwisowi zrobić # 1. Niestety dokumenty, które przeczytałem w tej sprawie, nie są do końca jasne, ale domyślam się, że to dlatego, że domyślnie serwery nie wysyłają nagłówka Access-Control-Allow-Origin, chyba że jest to skonfigurowane. Jeśli chcesz zezwolić na żądania AJAX, musisz albo zaufać wszelkim źródłom w nagłówku, aby nie wykonać ataku CSRF, możesz selektywnie zablokować wrażliwe części aplikacji, aby nie zezwalać na żądania AJAX, lub użyć innych nagłówków Access-Control-*, aby chronić siebie .

Korzystanie synchronizator token jest jeden sposób, że aplikacja może polegać od tego samego pochodzenia polityki zapobiegania CSRF utrzymując tajne token do uwierzytelniania żądań

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Powinieneś przeczytaj na Cross-Origin Resource Sharing (CORS).

+0

"Access-Control-Allow-Origin' nie zapobiega CSRF, wszystko co robi, to otworzyć ograniczenia nałożone przez [Politykę Same Origin] (https://en.wikipedia.org/wiki/Same- origin_policy). Polityka Same Origin nie zapobiega wysyłaniu żądań do Twojej domeny, po prostu zatrzymuje odczytywanie odpowiedzi. SOP może uniemożliwić odczytanie tokena synchronizatora, ale sam nie jest bezużyteczny do zapobiegania CSRF. – SilverlightFox

+1

"Musisz użyć nagłówka Access-Control-Allow-Origin" - Nie. 'Access-Control-Allow-Origin' ** rozluźnia ** bezpieczeństwo. Jest domyślnie bezpieczny. 'Access-Control-Allow-Origin' jest używany, jeśli * chcesz * strony osób trzecich, aby móc odczytać twoje dane. – Quentin

Powiązane problemy