Come escludere il backslash dall'esclusione di xss?

2

Sto cercando di aggirare alcuni filtri XSS. Ogni volta che inserisco una singola citazione ottengo un backslash, quindi ho scritto questo payload:

 \';alert(1);\'

Nel codice sorgente appare così:

<script>
a = '\';alert(1);\''
</script>

ma non riesco ancora a ottenere una finestra di avviso. Cosa c'è che non va?

    
posta Xozu 18.08.2016 - 10:51
fonte

2 risposte

1

È impossibile sapere con certezza senza vedere il codice che il server esegue, ma possiamo fare alcune ipotesi plausibili:

  • Sembra che ci sia un modello simile a questo:

    a = '{escape(input)}';
    
  • Dici che ' viene sostituito da \' .

  • Dal tuo esempio, sembra che \' non sia influenzato è un'eccezione alla regola precedente (probabilmente per prevenire l'attacco che stavi tentando). Questo è un po 'sorprendente - la cosa normale da fare sarebbe sostituire il \ con \ , quindi otterresti \\' .
  • Potrebbero esserci più difese integrate che non hai ancora notato perché non sei riuscito a ignorare il primo.

È importante capire il contesto da cui vuoi uscire. In questo caso è una stringa letterale JavaScript (o regola n. 3 in OWASP cheat foglio ). Per uscirne hai due opzioni:

  1. Passa a un contesto JavaScript generico. Penso che questo può essere fatto solo ottenendo un ' senza escape in là. Se \' è sempre inalterato indipendentemente dal contesto, prova \' . Se sei fortunato, non viene fatto nulla per il primo backslash. Mentre ci sei, prova diversi numeri di backslash, per ogni evenienza.

  2. Termina il blocco di script per entrare in un contesto HTML. Prova qualcosa del genere:

    </script><script> alert(1); </script><script>
    

    Molto probabilmente il < sarà convertito in% in &lt; , ma vale la pena provarlo.

Vedi anche questa domanda correlata .

    
risposta data 18.08.2016 - 11:29
fonte
0

Ignora doppia citazione di escape

In base alla tua descrizione, dovrebbe funzionare:

\ "); alert (" XSS

Il "sarà salvato come \", risultante in \ ", che sfugge a \, ma non a".

Per evitare ciò, dovresti per lo meno scappare \ come \.

Ignora il doppio virgolette di escape e il doppio backslash in una sola barra rovesciata

In base al tuo commento, suppongo che le parti rilevanti del filtro siano le seguenti:

" -> \"
\ -> \

Questo non è sicuro neanche. Un'iniezione potrebbe apparire come questa:

\\ "); alert (1

"sarà sfuggito come \" nel passo 1 che ci porta a \\ ", che viene poi trasformato in \" al passo 2. Non puoi usare virgolette doppie nella stringa iniettata, ma questo non è un problema come XSS con citazioni singole o completamente senza virgolette è perfettamente possibile.

Per garantire questo il doppio backslash dovrebbe essere sfuggito, non trasformato in uno solo, il che ci darebbe \\\\\ "con l'iniezione sopra descritta, che è sicura.

    
risposta data 18.08.2016 - 11:38
fonte

Leggi altre domande sui tag