it-swarm.dev

CSRF con JSON POST

Sto giocando con un'applicazione di test che accetta richieste JSON e la risposta è anche JSON. Sto provando a fare un CSRF per una transazione che accetta solo dati JSON con POST nella richiesta. L'applicazione genera un errore se viene richiesto l'URL usando il metodo get (ad es. In <script src=).

Inoltre, affinché l'attacco sia significativo, vale a dire la transazione da eseguire, devo inviare i dati nella richiesta. Se creo la mia pagina e invio le richieste JSON, i cookie non viaggiano e quindi il server restituisce un messaggio di errore non autenticato.

Non ci sono token casuali nella richiesta originale da parte del server.

Mi chiedevo se esiste un modo per eseguire con successo un attacco CSRF in questo scenario.

32
Sachin Kumar

Devi almeno controllare Content-Type: application/json sulla richiesta.

Non è possibile ottenere un POSTED <form> per inviare una richiesta con Content-Type: application/json. Ma puoi inviare un modulo con una struttura JSON valida nel corpo come enctype="text/plain".

Non è possibile eseguire un cross-Origin ( CORS ) XMLHttpRequest POST con Content-Type: application/json su un server non compatibile con Origini perché questo causerà una richiesta OPTIONS "pre-flighting" per approvarlo per primo. Ma puoi inviare un XMLHttpRequest di origine incrociata POST withCredentials se è text/plain.

Quindi anche con application/json controllando, puoi avvicinarti abbastanza a XSRF, se non del tutto lì. E i comportamenti su cui fai affidamento per renderlo sicuro sono alquanto oscuri, e ancora nella fase di Working Draft; non sono garanzie concrete per il futuro del web.

Questi potrebbero interrompersi, ad esempio se un nuovo JSON enctype fosse aggiunto ai moduli in una futura versione HTML. (WHATWG ha aggiunto il text/plain enctype in HTML5 e originariamente ha provato anche ad aggiungere text/xml, quindi non è fuori questione che ciò possa accadere.) Aumenta il rischio di compromissione da browser più piccoli e più sottili e dai bug dei plugin nell'implementazione di CORS.

Quindi, per quanto tu possa probabilmente cavartela per ora, non consiglierei assolutamente di andare avanti senza un adeguato sistema di token anti-XSRF.

37
bobince

Questo è sfruttabile usando Flash, secondo https://code.google.com/p/browsersec/wiki/Part2#Same-Origin_policy_for_Flash

La capacità di creare HTTP GET tra domini con cookie e POST richieste tramite lo stack del browser, con meno vincoli rispetto a quelli normalmente visti altrove nei browser. Ciò si ottiene tramite l'API URLRequest. La funzionalità, in particolare, include la possibilità di specificare valori di tipo di contenuto arbitrari e di inviare payload binari.

Non l'ho provato da solo, ma sembra plausibile.

Aggiornamento: sembra che le ultime versioni di Flash non consentano più richieste tra domini per impostazione predefinita, rendendolo non sfruttabile.

Aggiornamento n. 2: tuttavia esiste una vulnerabilità di lunga data nella gestione di 307 reindirizzamenti da parte di Flash, il che significa che è ancora sfruttabile

7
albinowax