2013-04-17 4 views
14

Ich habe gelesen, über die Verwendung eines Synchronizer-Token-Muster CSRF (CSRF bedeutet Cross-Site-Anfrage Fälschung.) Zu verhindern, und ich verstehe nicht, wie es wirklich sicher.Wie wird Synchronizer Token Pattern verwendet, um CSRF sicher zu verhindern?

Lassen Sie uns sagen, ich habe eine gefälschte Bank-Website fakebank.com mit zwei Urls:

  • fakebank.com/withdrawForm.html - eine GET-Anfrage, die die Geldform
  • fakebank.com/doWithdraw zurückzuziehen zeigt - POST an diese URL
  • die zurückziehen zu tun

Mein Verständnis der Sicherheitslücke ist, dass maliciousSite.com eine POST-Anforderung an fakebank.com/doWithdraw fälschen können, und wenn Sie sich gerade zu fakebank angemeldet sind, wird der POST erfolgreich sein.

Nehmen wir an, wir implementieren ein Synchronizer Token Pattern, das einen geheimen Code auf fakebank.com/withdrawForm.html einbetten wird. Kann maliciousSite.com nicht einfach eine GET-Anfrage für dieses Formular spoofen, das HTML-Ergebnis analysieren, das Token abrufen und dann die POST-Anfrage mit diesem Token erstellen?

Dies ist davon auszugehen, dass fakebank.com HTTP-Referrer oder Origin nicht überprüft oder maliciousSite.com erfolgreich spoofiert, dass der Referrer/Origin fimebank.com ist.

Antwort

18

Der Grund, warum dies ist sicher, und maliciousSite.com kann ein GET, stiehlt das Token nicht einfach tun, und tun dann ein POST ist, dass die Anforderung durch den Browser des Benutzers ausgeführt wird, nicht vom Server an maliciousSite.com. Alle von fakebank.com zurückgegebenen Daten werden an den Browser des Benutzers zurückgegeben, nicht an den Server um maliciousSite.com. Wenn maliciousSite.com einen GET ausführt, um ein Token abzurufen, handelt es sich um ein anderes Token als an den Benutzer ausgegeben wurde. maliciousSite.com kann diesen Cookie nicht in den Browser des Benutzers setzen, um ihn aufgrund derselben Domänenbeschränkungen an fakebank.com zu senden.

Der CSRF-Angriff POST funktioniert, indem er den Browser des Benutzers dazu bringt, fakebank.com/withdrawForm.html direkt anzufordern, indem er eine ordnungsgemäß gebildete POST Anfrage verwendet. Der Server unter fakebank.com führt die angeforderte POST glücklicherweise aus und überträgt so die Mittel unter Verwendung der Parameter, die in der POST-Nachricht enthalten sind (einschließlich eines Zielkontos des Angreifers, das dort durch maliciousSite.com eingetragen wurde). Der Server unter maliciousSite.com muss die zurückgegebenen Daten nicht sehen, da die Aktion ausgeführt wurde (es sei denn, fakebank.com verwendet diese CSRF-Tokens, die der maliciousSite.com möglicherweise nicht wissen kann, es sei denn, es wurde in irgendeiner Weise verbreitet. Es kann nicht fragen dafür). Wenn fakebank.com CSRF-Tokens verwendet, sendet maliciousSite.com eine Anforderung POST, in der das Token fehlt. Dies weist auf einen möglichen CSRF-Angriff hin.

Schwachstellen dieser Methode sind die Verwendung eines CSRF-Tokens, das nicht ausreichend geheim gehalten wird und in irgendeiner Form verbreitet wird. Wenn das CSRF-Token nicht ausreichend zufällig ist, kann es auch maliciousSite.com erraten. Wenn eine Schwachstelle in der Durchsetzung derselben Domänenrichtlinie durch den Browser besteht, könnte dies ebenfalls ausgenutzt werden. Im Allgemeinen sind moderne Browser nicht anfällig dafür.

Bitte lassen Sie mich wissen, wenn dies eine unzureichende Erklärung ist und ich werde versuchen, es ein wenig besser für Sie zu artikulieren.

+2

Wenn Sie Javascript in den Browser eines Benutzers injizieren können, um den Angriff zu initiieren, was hält Sie einfach einbetten einige Jquery, um eine GET-Anfrage zu tun, zu analysieren, dann einen POST alle innerhalb der gleichen '

2

Und das ist genau der Punkt. Die Same Origin Policy im Browser erlaubt nicht GET Anfragen an andere Websites. So kann keine Site das CSRF-Token von einem anderen abrufen, der Javascipt innerhalb des Browsers verwendet.