Recentemente abbiamo scritto di sicurezza delle applicazioni web quando si tratta di vulnerabilità XSS. Questa volta vogliamo attirare la vostra attenzione su un altro pericolo.
La vulnerabilità discussa in questo articolo è presente da molto tempo e, a causa della sua semplicità, è spesso sottovalutata o addirittura sconosciuta da alcuni. sviluppatori di applicazioni web.
Quasi tutte le applicazioni web contengono collegamenti che, se cliccati, si aprono in una nuova scheda, in modo da non chiudere la scheda con la pagina originale. Questo è un comportamento preferito perché i creatori vogliono che l'utente trascorra il maggior tempo possibile nell'applicazione.
Un attacco che sfrutta questa vulnerabilità è il cosiddetto "reverse tabnabbing". Si tratta di un attacco in cui una pagina collegata alla pagina di destinazione è in grado di sostituirla con, ad esempio, un sito di phishing.
Scenario di attacco
- Supponiamo che la vittima utilizzi Facebook, noto per l'apertura di link tramite target="_blank",
- Creare una finta pagina virale,
- Creare un sito web di phishing che assomigli alla pagina di accesso di Facebook,
- Mettere il seguente codice sulla pagina virale, ad esempio, tramite una vulnerabilità XSS trovata.
window.opener.location = 'https://phishing-website/facebook.com';
- La vittima clicca sul link di Facebook alla pagina virale,
- La pagina virale reindirizza la scheda di Facebook al sito web di phishing, chiedendo all'utente di accedere nuovamente.
Quindi, possiamo cambiare la scheda padre dalla pagina di destinazione infetta tramite l'oggetto finestra dell'API Web. In genere, un attacco prevede l'utilizzo di diverse vulnerabilità scoperte e truffe di phishing in parallelo.
Il problema
Quando si apre una nuova scheda nel browser utilizzando un collegamento con l'opzione target="_blank"
abbiamo accesso al nostro "referrer" dalla nuova scheda. Più precisamente, all'attributo apripista
della proprietà Finestra
che restituisce un riferimento alla finestra che l'ha aperta, la nostra pagina madre.
Questo è dovuto al comportamento del Finestra.open()
funzione. Con l'accesso a questo attributo, possiamo facilmente sostituire la nostra pagina madre. Si noti che alcuni browser moderni possono rendere finestra.apertura
nella scheda di destinazione come nullo
per evitare questo comportamento.
Codice di esempio
<code> <a href="https://github.com" target="_blank">Vai a GitHub - link infetto</a>
costitutivo se (link) link[0].onclick = () => { if (window) window.opener.location = 'https://stackoverflow.com' }
Qui sopra potete vedere il link infetto che in origine apre una nuova scheda con una pagina GitHub, ma nel frattempo cambia la nostra pagina "madre" in quella di Stackoverflow.
Esempio dal vivo
1. Collegamenti HTML
Aggiungi rel="noopener noreferrer"
alla <a>
tag.
Il rel
definisce la relazione tra una risorsa collegata e il documento corrente.
noopener
indica al browser di navigare verso la destinazione senza concedere l'accesso al genitore che l'ha aperta. Scheda di destinazione Finestra.opener
sarà nullo
.
noreferrer
impedisce al browser, quando si naviga verso la destinazione, di inviare al genitore l'indirizzo o qualsiasi altro valore come referrer tramite l'opzione referente
Intestazione HTTP. Si noti che il nome di questa intestazione HTTP è intenzionalmente scritto in modo errato come "referrer".
2. JavaScript collegamenti
Per il modello JavaScript Finestra.open
è possibile aggiungere i valori noopener
e noreferrer
nel finestraCaratteristiche
del parametro Finestra.open
ma i diversi browser possono rispondere in modo diverso, per cui si consiglia di rendere la funzione Finestra.opener
come nullo
dopo aver utilizzato Finestra.open()
funzione.
Per saperne di più:
API Rails e CORS. Un pizzico di consapevolezza
Strategie di recupero dei dati in NextJS
7 motivi per cui il vostro negozio online ha bisogno di Magento
Se avete trovato interessante questo articolo, seguite Lukasz su Github: https://github.com/twistezo