Frage:
Sollte ich den CSRF-Schutz für GET-Anfragen verwenden?
jtpereyda
2016-02-26 05:56:35 UTC
view on stackexchange narkive permalink

Ich habe im Web mehrere pauschale Anweisungen gesehen, die besagen, dass Sie keinen CSRF-Schutz für GET-Anforderungen benötigen.

Aber viele Webanwendungen haben GET-Anforderungen, die vertrauliche Daten zurückgeben, oder? Möchten Sie diese dann nicht vor CSRF-Angriffen schützen?

Vermisse ich etwas oder gehen diese pauschalen Aussagen davon aus, dass die von der GET-Anforderung angegebenen Daten unwichtig sind?

Beispiele für Umfassende Empfehlungen für die Verwendung von CSRF-Token mit GET:

Fünf antworten:
Neil Smithline
2016-02-26 09:56:37 UTC
view on stackexchange narkive permalink

CSRF-Schutz ist aufgrund der Richtlinie gleichen Ursprungs nur für Operationen zur Änderung des Status erforderlich. Diese Richtlinie besagt, dass:

ein Webbrowser Skripten auf einer ersten Webseite den Zugriff auf Daten auf einer zweiten Webseite ermöglicht, jedoch nur, wenn beide Webseiten denselben Ursprung haben.

Der CSRF-Angriff kann also nicht auf die angeforderten Daten zugreifen, da es sich um eine standortübergreifende Anforderung handelt (dies ist die CS in CSRF ) und durch die Politik des gleichen Ursprungs verboten. Daher ist der illegale Datenzugriff bei CSRF kein Problem.

Da ein CSRF-Angriff Befehle ausführen kann, deren Ergebnisse jedoch nicht angezeigt werden können, muss er blind handeln. Beispielsweise kann ein CSRF-Angriff Ihren Browser anweisen, Ihren Kontostand anzufordern, dieser Kontostand kann jedoch nicht angezeigt werden. Dies ist offensichtlich ein sinnloser Angriff (es sei denn, Sie versuchen, den Bankserver oder etwas anderes zu DDoS). Es ist jedoch nicht sinnlos, wenn beispielsweise der CSRF-Angriff Ihren Browser anweist, Ihre Bank anzuweisen, Geld von Ihrem Konto auf das Konto des Angreifers zu überweisen. Auf die Erfolgs- oder Fehlerseite für die Übertragung kann das angreifende Skript nicht zugreifen. Zum Glück für den Angreifer müssen sie die Antwort der Bank nicht sehen, sie wollen nur das Geld auf ihrem Konto haben.

Da wahrscheinlich nur Operationen zur Änderung des Zustands Ziel von CSRF-Angriffen sind, benötigen nur sie CSRF-Verteidigung.

Welchen Schritt sollte ich also unternehmen, um diesen "CSRF-Angriff" zu verhindern?
Dies ist jedoch nicht der Fall, wenn CORS beteiligt ist, oder?Z.B.Ich habe eine GET-Anfrage, die vertrauliche Daten zurückgibt und CORS-fähig ist. Sie können von einer böswilligen Site oder einer vertrauenswürdigen Site gelesen werden, die beispielsweise durch ein XSS kompromittiert wurde.
SilverlightFox
2016-02-26 16:24:33 UTC
view on stackexchange narkive permalink

Normalerweise sichere Methoden müssen nicht vor CSRF geschützt werden, da sie keine Änderungen an der Anwendung vornehmen. Selbst wenn sie vertrauliche Informationen zurückgeben, wird dies durch die Gleiche geschützt Ursprungsrichtlinie im Browser.

Wenn Ihre Site gemäß den Standards implementiert ist, sollten Ihre GET-Anforderungen sicher sein und daher keinen Schutz benötigen.

Dies ist jedoch der Fall Ein spezieller Fall, in dem ein "Cross-Site DoS" * sup> -Angriff ausgeführt werden könnte. Angenommen, die Ausführung Ihrer Berichtsseite dauert 10 Sekunden, wobei 100% der CPU auf Ihrem Datenbankserver und 80% der CPU auf Ihrem Webserver ausgelastet sind.

Benutzer Ihrer Website wissen, dass sie niemals zu https wechseln müssen : //yoursite.example.org/Analysis/GetReport während der Bürozeiten, da dadurch der Server zerstört und andere Benutzer eine schlechte Benutzererfahrung erhalten.

Allerdings Chuck möchte Ihre yoursite.example.org Website offline schalten, weil er Sie oder Ihr Unternehmen nicht mag.

In dem geschäftigen Forum, in dem er häufig Beiträge veröffentlicht, http: //forum.walkertexasranger.example.com setzt er seine Signatur auf Folgendes:

  <img src = "https://yoursite.example.org/Analysis/GetReport" width = 0 height = 0 / >  

Er weiß auch, dass Ihre Unternehmensmitarbeiter das Forum häufig besuchen, während sie gleichzeitig bei yoursite.example.org angemeldet sind.

Jedes Mal, wenn Ihre Mitarbeiter einen Beitrag von Chuck lesen, werden Authentifizierungscookies an https: //yoursite.e gesendet xample.org/Analysis/GetReport , sodass Ihre Site die Anforderung verarbeitet und den Bericht generiert und Ihr System offline geschaltet wird, da die CPU von diesen konstanten Anforderungen beansprucht wird.

Auch wenn die Anforderung dies ist Eine GET-Anfrage, die keine dauerhaften Änderungen an Ihrem System vornimmt (auch als "sicher" bezeichnet). Sie führt tatsächlich dazu, dass Ihr System bei jeder Ausführung heruntergefahren wird. Daher ist es besser, dies mit einer CSRF-Präventionsmethode zu schützen.

* XSDoS oder Cross-Site Denial if Service ist eine von mir geprägte Phrase, also googeln Sie nicht danach. sup>

Sie erwähnen die Umgehung des CSRF-Schutzes mithilfe eines "img" -Tags.Ich bin neugierig.Wenn "https: // yoursite.example.org / Analysis / GetReport" tatsächlich ein Bild eines vertraulichen Berichts (z. B. ein JPG) zurückgibt, wird das Bild dann geladen?Gibt es eine Möglichkeit, sich davor zu schützen?
Ja, es wird geladen, wenn der Inhaltstyp ein Bildtyp und ein gültiges Bild ist.Ja, Sie können dies mit einem CSRF-Token schützen und den Berichtscode, der das Image generiert hat, nur ausführen, wenn das Token gültig ist.
Natürlich muss die Benutzerwelt bei "yoursite.example.org" angemeldet sein, um das Bild im Forum zu sehen, damit sie nichts sehen, zu dem sie normalerweise keine Erlaubnis hätten.Es wäre jedoch unzusammenhängend und Chuck könnte das Bild möglicherweise verwenden, um Mitarbeiter zu täuschen, dass er die Daten selbst hat.Daher ist auch Social Engineering erforderlich, sodass dieses Szenario weniger wahrscheinlich ist.
Ich vergaß für einen Moment, dass Chuck das Bild nicht sehen oder auf irgendeine Weise darauf zugreifen konnte.Danke für deine Antwort.
d1str0
2016-02-26 06:00:07 UTC
view on stackexchange narkive permalink

Der CSRF-Schutz wird nicht zum Schutz von Daten verwendet. Es wird verwendet, um einen Benutzer vor einer unwissentlichen Änderung des Status zu schützen, z. B. vor der Überweisung von Geld oder der Abmeldung von einem Konto.

Wenn Ihre GET-Anforderung also einen Status ändert (der nicht sein sollte), dann Sie sollten CSRF-Schutz haben. Wenn jedoch nur Daten zurückgegeben werden, ist kein CSRF-Schutz erforderlich, da der CSRF-Schutz in diesem Fall nichts schützt.

Es kann hilfreich sein, diese Seite erneut durchzugehen: https: / /www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29

Bitte verwechseln Sie Besucher nicht mit dem umstrittenen Problem der CSRF-Abmeldung.
@Micheal Ich bin gespannt, wie umstritten es ist? Ich habe nicht gehört, dass es umstritten ist.
Dies ist umstritten, da Abmeldungen, während sich der Status ändert, normalerweise über GET erfolgen. Was sollen Sie also mit dem Anti-CSRF-Token tun? Einige halten es für ein Problem, andere nicht. Google akzeptiert zum Beispiel keine Bug-Bounty-Berichte. Meine Stimme ist es, die Kontoeinstellungen zu ändern.
Die Implementierung ist trivial und bietet Vorteile. GET kann mit CSRF-Token problemlos umgehen.
Sie sollten jedoch keine Anti-CSRF-Token in das GET einfügen, da diese im Browserverlauf, in den Proxy-Protokollen und in den Server-Protokollen landen.
Ich bin mir nicht sicher, wie das ein Problem ist, wenn sie ein Nonce sind.
Der Inhalt von @Micheal-Posts befindet sich ebenfalls in Protokollen, daher bin ich mir nicht sicher, ob ich dieses Argument verstehe.
POST-Inhalte sollten nicht in den Protokollen enthalten sein, es sei denn, der Server ist falsch konfiguriert.
Ich bin immer noch nicht davon überzeugt, dass ein CSRF-Token geschützt werden sollte. Wenn Sie sie wiederverwenden, ist das ein Problem.
Es ist nichts Falsches daran, ein Token innerhalb einer Sitzung wiederzuverwenden. Wenn Sie das Token einem breiteren Publikum zugänglich machen, auch wenn es einmalig ist, können Sie auf jemanden zugreifen, um das Geheimnis zu ermitteln, das zum Generieren des Tokens verwendet wurde, und dann das nächste Token vorhersagen. Das geringste Privileg, richtig? Mein Punkt ist, dass die Verwendung der Kontoabmeldung als Beispiel für eine Statusänderung für CSRF nur zu mehr Verwirrung führt. Aber mach was du willst.
h4ckNinja
2016-02-26 09:50:28 UTC
view on stackexchange narkive permalink

Bei CSRF oder Cross-Site Request Forgery geht es nicht darum, Daten vor dem Abrufen zu schützen, sondern darum, Daten vor Änderungen zu schützen. Dies wird auch als Zustandsänderung bezeichnet. In einer Anwendung können Statusänderungen Profildaten wie die E-Mail-Adresse, das Benutzerkennwort oder die Biografie oder die Überweisung von Geldern enthalten.

GET-Anforderungen müssen für idempotente Anforderungen oder Anforderungen verwendet werden, die den Status nicht ändern. Diese Anforderungen müssen keine Anti-CSRF-Token enthalten.

POST-Anforderungen müssen für nicht idempotente Anforderungen oder Anforderungen verwendet werden, die den Status ändern.

Stoud
2016-02-26 08:04:12 UTC
view on stackexchange narkive permalink

Im Allgemeinen sollten POST-Anforderungen zum Ändern des Status von etwas verwendet werden. Wenn Sie GET-Anforderungen eingerichtet haben, damit diese den Status ändern können (z. B. www.example.com/settings?delete_account=True), sollten Sie den CSRF-Schutz als Band-Aid-Fix verwenden.

Versuchen Sie, den Status mithilfe von POSTs zu ändern, nicht von GETs.

Diese Antwort ist für zukünftige Leser gefährlich. Nein, die Verwendung von POST-Anfragen schützt Sie nicht vor CSRF.Es ist sehr einfach, ein Formular mit "method = POST" einzurichten und "onload" senden zu lassen, sodass POSTs genauso schlecht sind wie GETs.Mit [Flash oder alten Browsern] (https://security.stackexchange.com/questions/170477/csrf-with-json-post-when-content-type-must-be-application-json) kann dies sogar noch schlimmer werdenJSON über POST senden.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...