Articles

DOM basato su Cross Site Scripting

Posted on

Il meno noto XSS Tecnica

  • DOM si distingue per un Modello di Oggetti Documento
  • XSS sta per cross-site scripting
  • La differenza principale tra DOM base XSS e altre vulnerabilità XSS è che il payload viene incorporato di tipo lato client piuttosto che lato server
  • DOM base di vulnerabilità XSS, pertanto, devono essere prevenuta sul lato client

Il Cross-site scripting (XSS) vulnerabilità prima divenne noto attraverso il CERT Advisory CA-2000-02 (Tag HTML dannosi incorporati nelle richieste Web client), anche se queste vulnerabilità erano state sfruttate prima. Quindi XSS è già in circolazione da un po’. E come ci si aspetterebbe, ci sono già stati un certo numero di articoli di Labs sull’argomento, tra cui Cross Site Scripting – Il pericolo sottovalutato e Cross-Site-Scripting e prevenire l’iniezione di script – Una breve guida. Tuttavia, questo articolo si concentra in gran parte sul cross-site scripting basato su DOM, un termine coniato per la prima volta nel 2005 da Amit Klein. Ha pubblicizzato la definizione di cross-site scripting (XSS) basato su DOM e lo ha delineato da altre vulnerabilità di cross-site scripting. Per comprendere lo scripting cross-site basato su DOM, è necessario prima una comprensione più profonda di DOM.

Che cos’è DOM?

Il Document Object Model è un’interfaccia di programma che definisce la struttura dei documenti. Ciò che è rilevante per i nostri scopi è che DOM fornisce la rappresentazione orientata agli oggetti dei documenti HTML, in particolare:

  • Come un elemento HTML è rappresentato come un oggetto
  • Cosa sono gli attributi di un elemento HTML sono
  • Quali metodi possono essere utilizzati per accedere a un elemento HTML
  • Che gli eventi di un elemento HTML sono

Questo significa che, DOM specifica come gli elementi del HTML può essere trovato, aggiunti, modificati o soppressi nel browser. Ciò significa che DOM offre un’opportunità per manipolare le pagine HTML. In questi giorni, JavaScript viene solitamente utilizzato per questo tipo di manipolazione.

Va notato che ogni browser implementa lo standard DOM in modo diverso. Ciò può influire sul fatto che uno specifico attacco DOM XSS funzioni in un particolare browser.

Che cos’è XSS basato su DOM?

Una vulnerabilità XSS basata su DOM si verifica quando il DOM viene utilizzato per generare contenuti dinamici contenenti input dell’utente che possono essere elaborati senza controllo. Questo tipo di attacco viene eseguito con JavaScript nel browser dell’utente. Qui le posizioni che l’input dell’utente (dannoso) porta nel DOM sono designate come fonte. Le posizioni in cui l’input utente (dannoso) può essere eseguito nel DOM sono designate come sink.

Un esempio di una semplice vulnerabilità di cross-site scripting:

<!DOCTYPE html><html> <body> <script> var source = "Hello " + decodeURIComponent(location.hash.split("#")); //Source var divElement = document.createElement("div"); divElement.innerHTML = source; //Sink document.body.appendChild(divElement); </script> </body></html>

La vulnerabilità può, ad esempio, essere attivata con la seguente richiesta GET:

GET www.vulnerable-website.example#<img src="test" onerror="alert('XSS')">

Possiamo vedere che questo esempio richiesto utilizzando il metodo decodeURIComponent. Questo perché i browser moderni codificano caratteri speciali nell’URL e l’attacco non funzionerebbe senza che questi caratteri speciali vengano decodificati. Il contenuto della variabile sourceviene aggiunto all’elemento div usando innerHTML. Questo è l’elemento problematico nel codice, perché la sua assegnazione a innerHTML fa sì che il valore incluso con esso venga interpretato come HTML. Se il valore contiene JavaScript, anche questo viene eseguito.

Va sottolineato che questo non altera la risposta del server. La modifica dannosa si verifica solo quando il codice JavaScript viene eseguito sul lato client, che il DOM successivamente altera.

Le fonti e i sink più noti sono elencati di seguito. Va notato che questo non è affatto un elenco esaustivo.

Fonti

  • documento.URL
  • documento.referrer
  • posizione
  • posizione.href
  • posizione.cerca
  • posizione.hash
  • posizione.percorso

Sink

  • eval
  • setTimeout
  • setInterval
  • documento.scrivi
  • elemento.innerHTML

Prevenire XSS basato su DOM

Poiché ci sono casi in cui il payload non arriva mai al server, prevenire questa vulnerabilità non è un’attività per il lato server. L’esempio sopra è uno di questi casi. Il motivo è che il contenuto che appare dopo un carattere # non viene inviato dal browser al server.

La prima e più importante raccomandazione è quella di evitare l’utilizzo di dati controllati dall’utente per la generazione dinamica di contenuti quando possibile. Se questo è completamente inevitabile, il modo migliore per prevenire XSS basato su DOM è usare metodi di output sicuri (sink) che impediscono l’esecuzione di qualsiasi codice maliziosamente incorporato. Nel frammento di codice sopra, l’unico modo per rendere il codice sicuro è sostituire .innerHTML con .textContent. Questo perché-a differenza di textContent non vengono eseguiti.

Il foglio di prevenzione XSS basato su DOM di OWASP ha molti consigli utili per lo sviluppo di siti Web dinamici sicuri con JavaScript. Lì troverai anche le descrizioni della codifica dipendente dal contesto, che è necessaria ogni volta che è impossibile passare a un metodo di output sicuro.

Differenze da altre vulnerabilità XSS

La differenza più importante è dove l’attacco è incorporato nel codice. A differenza di altre vulnerabilità cross-site scripting, il codice non è incorporato sul lato server, ma piuttosto sul lato client. Ciò significa che il payload non può essere trovato nel codice di risposta. Le vulnerabilità XSS basate su DOM possono quindi essere rilevate solo in fase di esecuzione o controllando il DOM del sito web.

Nella maggior parte dei casi, trovare vulnerabilità XSS basate su DOM non è facile. Un approccio utile che utilizza l’approccio di analisi del codice statico è descritto nell’articolo Burp based-xss.

Circa l’autore

Andrea Hauser

Andrea Hauser si è laureata con un Bachelor of Science FHO in information technology presso l’Università di Scienze Applicate Rapperswil. Sta concentrando il suo lavoro offensivo sui test di sicurezza delle applicazioni web e sulla realizzazione di campagne di social engineering. Il suo obiettivo di ricerca è la creazione e l’analisi deepfakes. (ORCID 0000-0002-5161-8658)

Link

  • http://www.webappsec.org/projects/articles/071105.html
  • https://support.portswigger.net/customer/portal/articles/2325926-using-burp-scanner-to-test-for-dom
  • https://www.cert.org/historical/advisories/CA-2000-02.cfm
  • https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
  • https://www.w3.org/DOM/

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.