Test CSRF di un endpoint API utilizzando le richieste GET

2

Ho un endpoint api che restituisce un nuovo token API in JSON all'utente se sono connessi al mio sito Web con solo i cookie di sessione utilizzati per l'autenticazione.

Sto provando a scrivere una parte di codice che viene caricata automaticamente su un dominio diverso che invierà una richiesta GET a quell'endpoint, utilizzando i cookie di tali persone per vedere se riesco a recuperare maliziosamente il loro nuovo token API. Sto solo controllando se il mio endpoint è sicuro o se è possibile. Voglio solo richieste loggate dallo stesso dominio in grado di raggiungere quell'endpoint. Non sono sicuro se questo è effettivamente considerato CSRF dal momento che non ci sono stati cambiamenti di stato. Esiste una politica CORS, quindi non sono sicuro se ciò mi impedisca di farlo. E la vernice è il front-end con X-XSS-Protection: 1 abilitato.

Cose che ho provato, semplicemente avendo una pagina di dominio diversa per caricare l'endpoint. Con un utente ha effettuato l'accesso in un'altra scheda. Restituisce un 200, con i cookie attesi dell'utente connesso, ma non la risposta JSON.

<img src="https://mydomain/endpoint"width="0" height="0" border="0">

Il sotto restituisce un 200 con i cookie corretti dell'utente loggato, ma nessuna risposta JSON. Credo che questo non stia restituendo dati a causa della stessa politica di origine nel browser. Correggimi se sbaglio.

document.write('<img src="https://mydomain/endpoint?cookie='+document.cookie+'" />')

Sia XMLHttpRequest che JQuery per eseguire una richiesta GET sull'endpoint di destinazione, sempre da un altro dominio e utente connesso a una scheda diversa. Restituisce un 401 non autorizzato e nessun cookie. Forse c'è qualche jquery aggiuntivo di cui ho bisogno per acquisire e inviare cookie con la richiesta.

$.get('https://mydomain/endpoint', function(responseText) {
alert(responseText);});

Oltre a copiare la richiesta di arricciatura dalla console degli sviluppatori di Chrome di una richiesta Web corretta all'endpoint API. Sorprendentemente il ricciolo non restituisce il nuovo token anche con i parametri attesi & biscotti. Forse anche a causa delle stesse politiche sull'origine.

Altre idee, è possibile anche con ciò che ho descritto?

    
posta mjmj 05.03.2018 - 19:13
fonte

2 risposte

2

Come hai iniziato a menzionare, CSRF è davvero utile solo per azioni che cambiano stato, quindi questo non è veramente un esempio di CSRF.

Da OWASP :

Cross-Site Request Forgery (CSRF) is an attack that forces an end user to execute unwanted actions on a web application in which they're currently authenticated. CSRF attacks specifically target state-changing requests, not theft of data, since the attacker has no way to see the response to the forged request.

Inoltre, la ragione per cui non si è in grado di vedere la risposta è probabilmente dovuta a Cross-Origin Resource Sharing (CORS).

Documenti Web MDN afferma:

For security reasons, browsers restrict cross-origin HTTP requests initiated from within scripts. For example, XMLHttpRequest and the Fetch API follow the same-origin policy. This means that a web application using those APIs can only request HTTP resources from the same domain the application was loaded from unless CORS headers are used.

Quindi, mentre le risorse remote sono effettivamente accessibili, il browser non consente al JavaScript nelle pagine di test di visualizzare le risposte. Tieni presente che si tratta del comportamento predefinito, a meno che tu non abbia deciso di impostare le intestazioni corrette sul server.

    
risposta data 05.03.2018 - 19:19
fonte
2

Fintanto che CORS è configurato correttamente, non è possibile estrarre informazioni da un altro dominio tramite JavaScript.

Dovresti anche controllare che i tuoi endpoint JSON restituiscano un oggetto, e non un array, da proteggere contro JSON Hijacking , una vecchia vulnerabilità che riguarda i vecchi browser.

    
risposta data 05.03.2018 - 19:20
fonte

Leggi altre domande sui tag