Per rispondere alle tue tre domande:
Correzione dell'output di escape corretto:
Rendi la tua patch XSS il DOM in modo che il JavaScript che si inietta sia rimosso da quel particolare tag. Ad esempio, puoi aggiungere come prefisso l'XSS iniettato con un carattere come una pipe (cioè |
) per aiutare a distinguere il vero nome:
var nameHtml = document.getElementById('username').innerHTML;
var parts = nameHtml.split("\">|", 2);
document.getElementById('username').innerHTML = parts[0];
Quindi, se il tuo XSS ha questo aspetto:
">|<script>alert(1);</script>
Il codice sopra rimuoverà tutto dopo e includendo ">|
.
Se non riesci ad eseguire il codice su quella pagina, puoi fare qualcos'altro?
Se è ancora possibile iniettare HTML nella pagina, ma non è possibile ottenere l'XSS a causa di una politica di sicurezza del contenuto o qualcosa di simile, è possibile iniettare CSS per nascondere completamente l'elemento nome utente, utilizzando display: none !important;
in modo che sovrascriva tutto. Se si tratta di un XSS memorizzato e puoi inviare CSRF, allora ti verrebbe risparmiato anche il fastidio.
Come impediresti al tuo payload di essere eseguito più di una volta?
Ci sono molti modi per farlo, tra cui:
- Verifica la presenza di un elemento con un ID noto nella pagina: se viene trovato, non eseguirlo, altrimenti crearlo.
- Verifica l'esistenza di un attributo denominato su un elemento che conosci già nella pagina di destinazione: se viene trovato, non eseguirlo, altrimenti aggiungilo.
- Definisci una classe o una variabile e verifica la sua esistenza.
- Se stai cercando di impedirne il funzionamento di nuovo durante l'aggiornamento, imposta un cookie.