it-swarm.dev

In che modo gli sviluppatori di app Web dovrebbero difendersi dal dirottamento di JSON?

Qual è la miglior difesa contro dirottamento JSON ?

Qualcuno può enumerare le difese standard e spiegare i loro punti di forza e di debolezza? Ecco alcune difese che ho visto suggerito:

  1. Se la risposta JSON contiene dati riservati/non pubblici, servire la risposta solo se la richiesta è autenticata (ad esempio, viene fornito con cookie che indicano una sessione autenticata).
  2. Se i dati JSON contengono qualcosa di riservato o non pubblico, ospitali in un URL segreto non indovinabile (ad esempio, un URL contenente un numero casuale di qualità crittografica a 128 bit) e condividi questo URL segreto solo con utenti/clienti autorizzati a vedere il dati.
  3. Inserire while(1); all'inizio della risposta JSON e fare in modo che il client lo spogli prima di analizzare JSON.
  4. Chiedi al client di inviare richieste di dati JSON come POST (non un GET) e fai in modo che il server ignori le richieste GET per i dati JSON.

Sono tutti sicuri? Ci sono dei motivi per scegliere uno di questi rispetto agli altri? Ci sono altre difese che mi mancano?

42
D.W.

La prima difesa è quella di attenersi alle specifiche usando JSON valido che richiede un oggetto come entità di livello superiore . Tutti gli attacchi noti si basano sul fatto che se l'oggetto di livello superiore è un array, la risposta è valida Java codice dello script che può essere analizzato utilizzando un tag <script>.

Se la risposta JSON contiene dati riservati/non pubblici, servire la risposta solo se la richiesta è autenticata (ad esempio, viene fornito con cookie che indicano una sessione autenticata).

Questo è il prerequisito per l'attacco , non una mitigazione. Se il browser ha un cookie per il sito A, lo includerà in tutte le richieste al sito A. Ciò è vero anche se la richiesta è stata attivata da un tag <script> sul sito B.

Se i dati JSON contengono qualcosa di riservato o non pubblico, ospitali in un URL segreto non indovinabile (ad esempio, un URL contenente un numero casuale di qualità crittografica a 128 bit) e condividi questo URL segreto solo con utenti/clienti autorizzati a vedere il dati.

Gli URL non sono considerati una funzione di sicurezza . Tutti i motori di ricerca comuni hanno componenti aggiuntivi/barre degli strumenti del browser che riportano qualsiasi URL visitato al fornitore del motore di ricerca. Anche se potrebbero segnalare solo URL visitati esplicitamente, non rischierei nemmeno questo per gli URL JSON.

Chiedi al client di inviare richieste di dati JSON come POST (non un GET) e fai in modo che il server ignori le richieste GET per i dati JSON.

Ciò impedirà di includere <script>.

Put while (1); all'inizio della risposta JSON e chiedere al client di rimuoverlo prima di analizzare JSON.

Suggerisco una versione modificata di questo approccio: Aggiungi </* All'inizio . while(1) è problematico per due motivi: in primo luogo è probabile che si attivi lo scanner maleware (su client, proxy e motore di ricerca). In secondo luogo, può essere utilizzato per attacchi DoS contro la CPU dei navigatori web. Tali attacchi hanno ovviamente origine dal tuo server.

28

Google utilizza " cruft non analizzabile " per difendersi da questo tipo di attacco. Questa vulnerabilità era risolto in Firefox . La vulnerabilità deriva dal modo in cui i browser implementano la specifica JSON.

3
rook

1) Se la risposta JSON contiene dati riservati/non pubblici, servire la risposta solo se la richiesta è autenticata (ad esempio, viene fornito con cookie che indicano una sessione autenticata). 2) Se i dati JSON contengono qualcosa di riservato o non pubblico, Ospitali in un URL segreto non indovinabile (ad esempio, un URL contenente un numero casuale di qualità crittografica a 128 bit) e condividi questo URL segreto solo con utenti/clienti autorizzati a vedi i dati.

Non ci sono buoni motivi per fare sia (1) che (2).

Il primo è ABAC e il secondo è ZBAC. Cercare di ottenere una difesa approfondita utilizzando più schemi di controllo degli accessi è solo una complicanza eccessiva.

3) Inserire while(1); all'inizio della risposta JSON e fare in modo che il client lo spogli prima di analizzare JSON.

4) Chiedere al client di inviare richieste di dati JSON come POST (non un GET) e fare in modo che il server ignori le richieste GET per i dati JSON.

Sembrano buone idee e aggiungono una difesa approfondita poiché aiutano a garantire che le credenziali non possano essere appropriate in modo inappropriato.

Inoltre,

5) Servire solo JSON con dati sensibili su SSL o altri canali sicuri.

per evitare la perdita di dati tramite MITM.

2
Mike Samuel