javascript - sheet - Warum steht Google vor(1); auf ihre JSON-Antworten?




owasp cheat sheet (4)

Da das <script> -Tag von der Same Origin Policy ausgenommen ist, ist dies eine Sicherheitsnotwendigkeit in der Web-Welt, while(1) der JSON-Antwort hinzugefügt wird, wenn es dem <script> -Tag missbräuchlich verwendet wird.

https://code.i-harness.com

Warum steht Google vor while(1); auf ihre (privaten) JSON-Antworten?

Hier ist zum Beispiel eine Antwort, wenn Sie einen Kalender in Google Kalender aktivieren und deaktivieren :

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Ich würde davon ausgehen, dass dies die Leute daran hindert, eval() darauf zu tun, aber alles, was Sie wirklich tun müssen, ist, die while ersetzen, und dann sind Sie fertig. Ich würde davon ausgehen, dass die Eval-Prävention darin besteht, sicherzustellen, dass die Benutzer sicheren JSON-Code schreiben.

Ich habe dies auch an einigen anderen Stellen gesehen, aber bei Google (Mail, Kalender, Kontakte usw.) ist das &&&START&&& Google &&&START&&& stattdessen mit &&&START&&& , und Google Contacts scheint while(1); &&&START&&& zu beginnen while(1); &&&START&&& while(1); &&&START&&& .

Was ist denn hier los?


Dadurch wird sichergestellt, dass eine andere Website keine bösen Tricks ausführen kann, um Ihre Daten zu stehlen. Wenn Sie beispielsweise den Array-Konstruktor ersetzen und dann diese JSON-URL über ein <script> -Tag einschließen, kann eine böswillige Website eines Drittanbieters die Daten aus der JSON-Antwort stehlen. Indem Sie eine while(1); Am Anfang hängt das Skript stattdessen.

Dagegen kann eine Anforderung für dieselbe Site, die XHR verwendet, und einen separaten JSON-Parser, das while(1); leicht ignorieren while(1); Präfix.


Es verhindert JSON-Hijacking , ein wichtiges JSON-Sicherheitsproblem, das in allen großen Browsern seit 2011 mit ECMAScript 5 formal fixed .

Behauptetes Beispiel: Angenommen, Google hat eine URL wie mail.google.com/json?action=inbox die die ersten 50 Nachrichten Ihres Posteingangs im JSON-Format zurückgibt. Böse Websites in anderen Domänen können aufgrund der Richtlinie mit demselben Ursprung keine AJAX-Anfragen zum Abrufen dieser Daten stellen. Sie können jedoch die URL über ein <script> -Tag angeben. Die URL wird mit Ihren Cookies besucht. Durch das Überschreiben der globalen Array-Konstruktor- oder Zugriffsmethoden kann eine Methode aufgerufen werden, wenn ein Objektattribut (Array oder Hash-Attribut) gesetzt wird, wodurch der JSON-Inhalt gelesen werden kann.

Die while(1); oder &&&BLAH&&& verhindert dies: Eine AJAX-Anfrage bei mail.google.com hat vollen Zugriff auf den Textinhalt und kann ihn entfernen. Durch das Einfügen eines <script> -Tags wird das JavaScript jedoch blind ohne Verarbeitung ausgeführt, was entweder zu einer Endlosschleife oder zu einem Syntaxfehler führt.

Das Problem der standortübergreifenden Anforderungsfälschung wird nicht angesprochen .


Es verhindert die Offenlegung der Antwort durch JSON-Hijacking.

Theoretisch ist der Inhalt von HTTP-Antworten durch die Same Origin-Richtlinie geschützt: Seiten einer Domäne können keine Informationen von Seiten in der anderen Domäne abrufen (sofern dies nicht ausdrücklich erlaubt ist).

Ein Angreifer kann in Ihrem Namen Seiten anderer Domänen anfordern, z. B. mithilfe eines Tags <script src=...> oder <img> , er kann jedoch keine Informationen zum Ergebnis (Kopfzeilen, Inhalt) abrufen.

Wenn Sie also die Seite eines Angreifers besuchen, konnte Ihre E-Mail-Adresse von gmail.com nicht gelesen werden.

Wenn jedoch ein Script-Tag zum Anfordern von JSON-Inhalten verwendet wird, wird der JSON-Code in einer kontrollierten Umgebung eines Angreifers als Javascript ausgeführt. Wenn der Angreifer den Array- oder Objektkonstruktor oder eine andere während der Objekterstellung verwendete Methode ersetzen kann, würde alles in der JSON-Instanz den Code des Angreifers passieren und offengelegt werden.

Beachten Sie, dass dies zu dem Zeitpunkt geschieht, zu dem der JSON als Javascript ausgeführt wird, nicht zu dem Zeitpunkt, zu dem er analysiert wird.

Es gibt mehrere Gegenmaßnahmen:

Stellen Sie sicher, dass der JSON niemals ausgeführt wird

Durch Platzieren einer while(1); Vor den JSON-Daten stellt Google sicher, dass die JSON-Daten niemals als Javascript ausgeführt werden.

Nur eine seriöse Seite könnte tatsächlich den gesamten Inhalt erhalten, while(1); und parst den Rest als JSON.

Dinge wie for(;;); Bei Facebook zum Beispiel mit den gleichen Ergebnissen gesehen.

Stellen Sie sicher, dass der JSON-Code nicht gültig ist

&&&START&&& vor dem JSON ungültige Token hinzufügen, wie &&&START&&& , wird sichergestellt, dass der Token niemals ausgeführt wird.

Geben Sie JSON immer mit einem Objekt nach außen zurück

Dies ist eine von OWASP empfohlene Methode , um sich vor JSON-Hijacking zu schützen, und ist die weniger aufdringliche.

Ähnlich wie bei den vorherigen Gegenmaßnahmen wird sichergestellt, dass die JSON niemals als Javascript ausgeführt wird.

Ein gültiges JSON-Objekt ist in Javascript nicht gültig, wenn es nicht eingeschlossen ist.

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Dies ist jedoch gültige JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Wenn Sie also sicherstellen, dass Sie immer ein Objekt auf der obersten Ebene der Antwort zurückgeben, stellen Sie sicher, dass JSON kein gültiges Javascript ist, während es weiterhin gültiges JSON ist.

Wie von @hvd in den Kommentaren erwähnt, ist das leere Objekt {} gültiges Javascript, und das Wissen, dass das Objekt leer ist, kann selbst wertvolle Informationen sein.

Vergleich der obigen Methoden

Die OWASP-Methode ist weniger aufdringlich, da keine Änderungen an der Client-Bibliothek erforderlich sind und gültige JSON-Daten übertragen werden. Es ist jedoch unsicher, ob vergangene oder zukünftige Browser-Fehler dies verhindern könnten. Wie @oriadam feststellt, ist es unklar, ob Daten durch eine Fehlerbehandlung bei einem Parser-Fehler durchgesickert werden könnten oder nicht (z. B. window.onerror).

Googles Weg erfordert eine Client-Bibliothek, um die automatische De-Serialisierung zu unterstützen, und kann hinsichtlich Browser-Fehlern als sicherer angesehen werden.

Beide Methoden erfordern serverseitige Änderungen, um zu verhindern, dass Entwickler versehentlich anfällige JSON senden.





security