Sicurezza delle applicazioni web. Vulnerabilità target="_blank"
Lukasz Kolko
L'uso delle applicazioni web è diventato comune per ogni società. Abbiamo a che fare con esse ogni giorno. Possiamo dire che ci circondano. Le usiamo al lavoro, per l'intrattenimento e come strumenti per comunicare con gli altri. Spesso, come utenti e sviluppatori, non ci rendiamo conto di quante vulnerabilità di sicurezza vengono scoperte ogni giorno in queste applicazioni.
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".
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.