Se controlli gli avvisi di sicurezza aggiornati, è facile trovare nuove vulnerabilità XSS riflesse e archiviate scoperte ogni mese. Tuttavia, lo stesso non vale per XSS basato su DOM, che sta diventando raro al giorno d’oggi. Il motivo è che XSS basato su DOM è completamente basato sul browser e non deve andare al server e tornare al client. A un certo punto, un esempio di proof of concept di XSS basato su DOM poteva essere creato utilizzando una pagina HTML statica; tuttavia, con la sicurezza intrinseca migliorata dei browser Web, XSS basato su DOM è diventato estremamente difficile.
Cos’è un DOM?
Prima di immergerci in XSS basato su DOM, esaminiamo cos’è il Document Object Model (DOM). Il DOM è un’interfaccia di programmazione che rappresenta un documento Web come un albero. Il DOM consente di accedere e manipolare a livello di programmazione le diverse parti di un sito Web utilizzando JavaScript. Consideriamo un esempio pratico. Consideriamo il codice HTML di example.com nello screenshot qui sotto (come recuperato il primo febbraio 2024). Abbiamo aperto Web Developer Tools utilizzando il browser Web Firefox e controllato la scheda Inspector.

L’albero DOM mostrato sopra è simile al seguente elenco con sottoelenchi:
document<!DOCTYPE html>htmlheadtitlemetametametastyle
bodydivh1ppa
L’albero inizia con il nodo del documento e si ramifica in DOCTYPE e html. Il nodo html si ramifica in head e body. La head ha il titolo, alcuni meta tag e uno stile. In questo semplice esempio, il body ha un singolo div che si ramifica in un h1 e due p. Questa è una pagina concisa. Pagine più reali avrebbero decine o centinaia di rami. Possiamo visualizzare l’albero DOM utilizzando gli Strumenti per sviluppatori Web integrati nel browser Web.
Vulnerabilità
Le vulnerabilità XSS basate su DOM si verificano all’interno del browser. Non devono andare al server e tornare al browser web del client. In altre parole, l’attaccante cercherà di sfruttare questa situazione iniettando uno script dannoso, ad esempio, nell’URL, e verrà eseguito sul lato del client senza alcun ruolo per il server in questo. Presenteremo un sito statico elementare e minimo senza fare affidamento sul codice back-end per dimostrare questo concetto.
Consideriamo il seguente esempio di base. È talmente semplice da risultare irrealistico; tuttavia, è sufficiente per dimostrare l’XSS basato su DOM.
<!DOCTYPE html>
<html>
<head>
<title>Vulnerable Page</title>
</head>
<body>
<div id="greeting"></div>
<script>
const name = new URLSearchParams(window.location.search).get('name');
document.write("Hello, " + name);
</script>
</body>
</html>La pagina sopra si aspetta che l’utente fornisca il proprio nome dopo ?name=. Nello screenshot qui sotto:
- L’utente ha inserito Web Tester dopo ?name nell’URL.
- Il saluto ha funzionato come previsto e ha visualizzato “Hello, Web Tester”.
- Infine, la struttura DOM sulla destra è rimasta intatta; body ha tre figli diretti.

L’utente potrebbe provare a iniettare uno script dannoso. Nello screenshot qui sotto possiamo notare che l’utente al poso di Web Tester ha inserito il payload:
<script>alert("XSS")</script>
E come possiamo notare il codice è stato eseguito correttamente e il pop-up è apparso.
Codice sanitizzato:
<!DOCTYPE html>
<html>
<head>
<title>Secure Page</title>
</head>
<body>
<div id="greeting"></div>
<script>
const name = new URLSearchParams(window.location.search).get('name');
// Escape the user input to prevent XSS attacks
const escapedName = encodeURIComponent(name);
document.getElementById("greeting").textContent = "Hello, " + escapedName;
</script>
</body>
</html>Questo codice converte il codice javascript in URL in modo da non farlo eseguire dal browser.