Vraag Waarom staat Google vóór (1); op hun JSON-antwoorden?


Waarom staat Google vóór while(1); op hun (privé) JSON-antwoorden?

Dit is bijvoorbeeld een reactie bij het in- en uitschakelen van een agenda Google kalender:

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

Ik neem aan dat dit is om te voorkomen dat mensen een eval() erop, maar het enige dat je echt zou moeten doen is het vervangen while en dan was je klaar. Ik veronderstel dat de eval-preventie ervoor zorgt dat mensen veilige JSON-ontleedcode schrijven.

Ik heb dit op een aantal andere plaatsen ook gebruikt, maar veel meer met Google (Mail, Agenda, Contacten, etc.). Vreemd genoeg, Google documenten begint met &&&START&&& in plaats daarvan lijkt Google Contacten te beginnen while(1); &&&START&&&.

Wat is hier aan de hand?


3483
2018-04-19 18:00


oorsprong


antwoorden:


Het voorkomt JSON kaping.

Voorbeeld: zeg Google heeft een URL zoals mail.google.com/json?action=inbox die de eerste 50 berichten van je inbox in JSON-formaat retourneert. Kwaadaardige websites in andere domeinen kunnen geen AJAX-verzoeken doen om deze gegevens te krijgen vanwege hetzelfde-oorsprongbeleid, maar ze kunnen de URL via een <script> label. De URL wordt bezocht met jouw cookies, en door de globale arrayconstructor- of accessormethoden overschrijven ze kunnen een methode gebruiken die wordt aangeroepen wanneer een object (array of hash) -kenmerk is ingesteld, zodat ze de JSON-inhoud kunnen lezen.

De while(1); of &&&BLAH&&& voorkomt dit: een AJAX-aanvraag op mail.google.com heeft volledige toegang tot de tekstinhoud en kan deze wegnemen. Maar a <script> tag invoegen voert blindelings JavaScript uit zonder enige bewerking, resulterend in een oneindige lus of een syntaxisfout.

Hiermee wordt het probleem van cross-site aanvraag vervalsing.


3760
2018-04-19 18:11



Het voorkomt de bekendmaking van het antwoord door JSON-kaping.

In theorie wordt de inhoud van HTTP-responsen beschermd door hetzelfde oorsprongsbeleid: pagina's van het ene domein kunnen geen informatie krijgen van pagina's in een ander domein (tenzij expliciet toegestaan).

Een aanvaller kan namens u pagina's in andere domeinen aanvragen, bijvoorbeeld door a te gebruiken <script src=...> of <img>tag, maar het kan geen informatie over het resultaat krijgen (headers, inhoud).

Dus als u de pagina van een aanvaller bezoekt, kan deze uw e-mail van gmail.com niet lezen.

Behalve dat wanneer een scripttag wordt gebruikt om JSON-inhoud aan te vragen, de JSON wordt uitgevoerd als Javascript in de gecontroleerde omgeving van een aanvaller. Als de aanvaller de constructor van de array of het object of een andere methode die tijdens de constructie van het object wordt gebruikt, kan vervangen, zou alles in de JSON de code van de aanvaller passeren en worden bekendgemaakt.

Merk op dat dit gebeurt op het moment dat de JSON wordt uitgevoerd als Javascript, niet op het moment dat deze wordt geparseerd.

Er zijn meerdere tegenmaatregelen:

Ervoor zorgen dat de JSON nooit wordt uitgevoerd

Door een while(1); verklaring vóór de JSON-gegevens, zorgt Google ervoor dat de JSON-gegevens nooit als JavaScript worden uitgevoerd.

Alleen een legitieme pagina kan de volledige inhoud krijgen, de while(1);en de rest analyseren als JSON.

Dingen zoals for(;;); zijn bijvoorbeeld op Facebook gezien, met dezelfde resultaten.

Ervoor zorgen dat de JSON niet geldig is Javascript

Evenzo, het toevoegen van ongeldige tokens vóór de JSON, zoals &&&START&&&, zorgt ervoor dat het nooit wordt uitgevoerd.

Retourneer JSON altijd met een object aan de buitenkant

Dit is OWASP aanbevolen manier beschermen tegen JSON-kaping, en is de minst ingrijpende.

Net als bij de vorige tegenmaatregelen, zorgt het ervoor dat de JSON nooit als Javascript wordt uitgevoerd.

Een geldig JSON-object is, wanneer het niet door iets is ingesloten, niet geldig in Javascript:

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

Dit is echter geldige JSON:

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

Als u ervoor zorgt dat u altijd een object op het hoogste niveau van het antwoord retourneert, zorgt u ervoor dat JSON geen geldig Javascript is en JSON nog steeds geldig is.

Zoals opgemerkt door @hvd in de comments, het lege object {} is geldig Javascript, en weten dat het object leeg is, kan zelf waardevolle informatie zijn.

Vergelijking van bovenstaande methoden

De OWASP-manier is minder opdringerig, omdat er geen clientbibliotheekwijzigingen nodig zijn en geldige JSON wordt overgedragen. Het is niet zeker of eerdere of toekomstige browser bugs dit kunnen verslaan. Zoals opgemerkt door @oriadam, is het onduidelijk of gegevens kunnen worden gelekt in een parse-fout door een foutafhandeling of niet (bijvoorbeeld window.onerror).

De manier van Google vereist een clientbibliotheek om automatische de-serialisatie te ondersteunen en kan als veiliger worden beschouwd met betrekking tot browser-bugs.

Beide methoden vereisen wijzigingen aan de serverkant om te voorkomen dat ontwikkelaars per ongeluk kwetsbare JSON verzenden.


442
2018-02-02 12:09



Dit is om ervoor te zorgen dat een andere site geen vervelende trucjes kan doen om te proberen uw gegevens te stelen. Bijvoorbeeld door vervang de array-constructor, dan inclusief deze JSON URL via een <script> tag, kan een kwaadwillende site van een derde partij de gegevens van de JSON-reactie stelen. Door een while(1); aan het begin hangt het script in plaats daarvan.

Een request op dezelfde site met behulp van XHR en een afzonderlijke JSON-parser daarentegen, kan de. Eenvoudig negeren while(1); voorvoegsel.


343
2018-05-16 02:08



Dat zou zijn om het voor een externe partij moeilijk te maken om de JSON-reactie in te voegen in een HTML-document met de <script> label. Vergeet niet dat de <script> tag is vrijgesteld van de Hetzelfde oorsprongsbeleid.


97
2018-04-19 18:04



Het voorkomt dat het wordt gebruikt als doelwit van een simpele <script> label. (Nou, het voorkomt het niet, maar het maakt het onaangenaam.) Op die manier kunnen slechteriken niet alleen die scripttag in hun eigen site plaatsen en vertrouwen op een actieve sessie om het mogelijk te maken om je inhoud op te halen.

Bewerk - noteer de opmerking (en andere antwoorden). Het probleem heeft te maken met ondermijnde ingebouwde faciliteiten, met name de Object en Array constructeurs. Die kunnen zodanig worden gewijzigd dat anderszins onschadelijke JSON, indien geparseerd, aanvallercode zou kunnen activeren.


65
2018-04-19 18:02



Sinds de <script> tag is vrijgesteld van hetzelfde oorsprongsbeleid dat een beveiligingsbehoefte is in de webwereld, terwijl (1) wanneer het wordt toegevoegd aan het JSON-antwoord, misbruik ervan in de webwereld wordt voorkomen <script>label.


3
2017-08-18 04:14