Il cross-site scripting riflesso (o XSS) si verifica quando un’applicazione riceve dati in una richiesta HTTP e li include nella risposta immediata in modo non sicuro.
Supponiamo che un sito web abbia una funzione di ricerca che riceve il termine di ricerca fornito dall’utente in un parametro URL:
https://insecure-website.com/search?term=gift
L’applicazione riporta il termine di ricerca fornito nella risposta a questo URL:
<p>You Searched for: gift</p>
Supponendo che l’applicazione non esegua alcuna altra elaborazione dei dati, un aggressore può costruire un attacco come questo:
https://insecure-website.com/search?term=<script>/*+Bad+stuff+here...+*/</script>
Questo URL genera la seguente risposta:
<p>You searched for: <script>/* Bad stuff here... */</script></p>
-
Verificare ogni punto di ingresso. Verificare separatamente ogni punto di ingresso per i dati contenuti nelle richieste HTTP dell’applicazione. Ciò include i parametri o altri dati presenti nella stringa di query dell’URL, nel corpo del messaggio e nel percorso del file dell’URL. Sono incluse anche le intestazioni HTTP, sebbene comportamenti simili all’XSS che possono essere attivati solo tramite determinate intestazioni HTTP potrebbero non essere sfruttabili nella pratica.
-
Invia valori alfanumerici casuali. Per ogni punto di ingresso, invia un valore casuale unico e verifica se il valore si riflette nella risposta. Il valore dovrebbe essere progettato per superare la maggior parte delle convalide di input, quindi deve essere abbastanza breve e contenere solo caratteri alfanumerici. Tuttavia, deve essere abbastanza lungo da rendere altamente improbabili corrispondenze accidentali all’interno della risposta. Un valore alfanumerico casuale di circa 8 caratteri è normalmente l’ideale. È possibile utilizzare i payload numerici di Burp Intruder con valori esadecimali generati casualmente per generare valori casuali adeguati. Inoltre, è possibile utilizzare le impostazioni dei payload grep di Burp Intruder per contrassegnare automaticamente le risposte che contengono il valore inviato.
-
Determina il contesto di riflessione. Per ogni posizione all’interno della risposta in cui il valore casuale viene riflesso, determina il suo contesto. Questo potrebbe trovarsi nel testo tra i tag HTML, all’interno di un attributo di tag che potrebbe essere racchiuso tra virgolette, all’interno di una stringa JavaScript, ecc.
-
Testa un payload candidato. In base al contesto della riflessione, testa un payload XSS candidato iniziale che attiverà l’esecuzione di JavaScript se viene riflesso senza modifiche all’interno della risposta. Il modo più semplice
-
Prova payload alternativi. Se il payload XSS candidato è stato modificato dall’applicazione o bloccato del tutto, dovrai testare payload e tecniche alternativi che potrebbero consentire un attacco XSS funzionante, in base al contesto della riflessione e al tipo di convalida dell’input che viene eseguita. Per ulteriori dettagli, consulta i contesti di cross-site scripting
-
Prova l’attacco in un browser. Infine, se riesci a trovare un payload che sembra funzionare all’interno di Burp Repeater, trasferisci l’attacco su un browser reale (incollando l’URL nella barra degli indirizzi o modificando la richiesta nella vista di intercettazione di Burp Proxy) e verifica se il JavaScript iniettato viene effettivamente eseguito. Spesso è meglio eseguire un semplice codice JavaScript come alert(document.domain), che, se l’attacco ha successo, farà apparire un popup visibile all’interno del browser.
Strumenti Automatici
Il miglior strumento per testare queste vulenerabilità è OWASP ZAP che ti permette di fare attacchi di bruteforce a sezioni potenzialmente vulnerabili tramite una sua wordlist dedicata. In alternativa si può utilizzare anche FFUF che ti permette di testare ogni paramentro della richiesta.