Perché non è possibile aggirare SOP utilizzando l'attributo "src" nel tag dello script?

0

Non ho familiarità con Javascript, ma voglio sapere cosa non può essere fatto in questa procedura per aggirare SOP ed estrarre dati sensibili:

  1. imposta il tag <script src="https://facebook.com/messages"></script>
  2. il browser recupera il contenuto di https://facebook.com/messages
  3. il browser, pensando che sia un codice JS, metti il contenuto HTML all'interno di <script> tag
  4. un altro pezzo di codice JS ottiene il contenuto del tag <script> e lo invia al server dell'attaccante
posta Reda LM 29.03.2018 - 19:18
fonte

3 risposte

5

Perché il passaggio 4 è impossibile. Non solo per la politica della stessa origine, ma perché non c'è semplicemente modo di recuperare il contenuto di un tag script tramite JavaScript.

C'è HTMLScriptElement.text , ma recupera solo il testo tra l'inizio dello script e fine tag. Non può recuperare il contenuto caricato tramite l'attributo src.

Detto questo, esiste effettivamente un modo in cui i tag script possono essere utilizzati per aggirare la politica della stessa origine in circostanze limitate. Se carichi uno script da un altro dominio e lo esegui, potresti essere in grado di ricavare alcune informazioni dagli effetti collaterali di tale esecuzione. Ecco come funziona JSONP. Questo di solito non è un problema di sicurezza, poiché la maggior parte degli endpoint JSONP sono progettati tenendo conto dell'accesso cross-origin, e la maggior parte degli altri tipi di script sono asset statici che non contengono informazioni riservate.

    
risposta data 29.03.2018 - 19:35
fonte
3

Come menzionato da @ Ajedi32 non esiste alcuna funzione per recuperare il contenuto di una script caricata dinamicamente.

Tuttavia, potresti essere ancora in grado di recuperare parte del contenuto se la risorsa è javascript valido. Questo attacco è chiamato xssi .

Le intestazioni HTTP Content-Type e X-Content-Type-Options vengono utilizzate per impedire questo tipo di attacco:

  • Content-Type specifica il tipo di contenuto del documento. Per una pagina web, di solito dovrebbe essere text/html e application/javascript per uno script.
  • X-Content-Type-Options : nosniff impedisce al browser di provare a cambiare il Tipo MIME della risorsa. Quindi, anche se una risorsa è caricata in un tag script ed è javascript valido, se Content-type è text/html non verrà eseguito.

Se dai un'occhiata alle intestazioni https://facebook.com/messages , troverai entrambe le intestazioni.

    
risposta data 29.03.2018 - 20:01
fonte
3
  1. the browser, thinking it's a JS code, put the HTML content inside <script> tag

Quando il browser carica uno script referenziato tramite <script src=...> , in realtà non aggiunge il suo contenuto al DOM. Quindi document.scripts[0].textContent ti darebbe solo una stringa vuota.

Invece, il browser tenta di eseguire lo script di riferimento come JS e, nel tuo esempio, fallisce in tutti i browser perché il documento HTML in https://facebook.com/messages non è JS valido, con conseguente errore di sintassi. Anche se fosse JS in qualche modo valido, il documento è servito con un tipo MIME di text/html e un'intestazione X-Content-Type-Options: nosniff , quindi il tuo browser sarà rifiuta di eseguirlo come script.

    
risposta data 29.03.2018 - 20:23
fonte

Leggi altre domande sui tag