Nascondi payload XSS

1

Scenario: esiste un XSS persistente su una pagina con le informazioni sul nome utente. Il nome utente è presente tre volte nella pagina, è visibile solo una volta e quello visibile è correttamente in escape.

  1. Come nasconderesti il carico utile in modo che non fosse visibile quando viene visualizzato il nome utente?

    • La mia prima idea era quella di cambiare il testo visualizzato all'interno del payload.
    • Seconda idea usando caratteri invisibili:

    Bob "> & nbsp; & nbsp; [...] PAYLOAD

  2. e se il carico utile non può essere eseguito su una pagina specifica, come nasconderesti il carico utile?

  3. Come eviterai che il tuo carico utile venga eseguito più di una volta?

    • È possibile utilizzare una sorta di variabile javascript globale come bandiera?
posta Techbrunch 01.08.2013 - 04:02
fonte

2 risposte

3

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.
risposta data 01.08.2013 - 14:42
fonte
0

Potresti usare l'XSS per cambiare il nome utente visibile, in modo che appaia benigno. Ad esempio, lo script iniettato potrebbe fare qualcosa di simile:

document.getElementById("displayedUsername").innerHTML = "john";

Per rispondere alla seconda parte della domanda, sì è possibile garantire che il codice venga eseguito una sola volta, utilizzando una variabile globale. Il codice sarebbe simile a questo:

var alreadyExecuted;
if (alreadyExecuted !== true) {
  alreadyExecuted = true;
  // your code here

}
    
risposta data 01.08.2013 - 04:35
fonte

Leggi altre domande sui tag