I backslash senza escape sono pericolosi in termini di XSS?

2

Pensavo che il carattere \ (backslash) fosse un personaggio pericoloso che dovevi filtrare / codificare correttamente per proteggerti dagli attacchi XSS (lo dice anche OWASP), e lo faccio ancora, ma perché?

Ho trovato un sito Web in cui è archiviata la query di ricerca quando si cerca nel sito Web una variabile JavaScript, come questa:

var_name = "query"

Filtra doppie virgolette, virgolette singole e punti e virgola, ma sono in grado di usare cose come \n e \r (anche se \r sembra solo rendere spazio bianco ...) ma per qualche motivo sono solo ora in grado di ottenere il alert() chiamato con successo.

Ho giocato con \n , come mettere un po 'prima e dopo alert() , e anche sfuggire alla doppia citazione di chiusura:

var_name = "\n\nalert()\n\n\"

Ma niente sembra funzionare. Penso che mi manchi qualcosa di ovvio qui, ma se qualcuno potesse aiutarmi qui e chiarire questo sarei grato!

    
posta David 11.10.2018 - 20:07
fonte

1 risposta

3

Le barre rovesciate senza escape possono essere pericolose, a seconda del contesto.

Supponiamo che X e Y siano controllati dall'utente (con ' e < con escape, ma non \ ). Quindi, questo è sfruttabile:

<script>
var name = "X"; var id = "Y";
</script>

Un utente malintenzionato può impostare X su \ per evitare la citazione di chiusura della prima stringa ( " ) e impostare Y su ;alert()// per iniettare il carico utile e commentare il superfluo "; . La linea sarebbe quindi simile a questa:

var name = "\"; var id = ";alert()//";
           |---string----|        |--comment ...

Ma questo non è sfruttabile:

<script>
var name = "X";
var id = "Y";
</script>

Anche se un utente malintenzionato può rimuovere qui anche il primo " di chiusura, una stringa con quotazione singola o doppia può estendersi su più righe solo se ogni riga precedente termina con \ . Ma in questo esempio, anche se l'attaccante può iniettare una nuova riga, tutto ciò che possono fare è provocare un errore di sintassi, nessuna iniezione di script perché non controllano la fine di tutte le linee nella stringa.

OTOH, se queste stringhe fossero tra virgolette apicali ("template letterali"), potrebbero estendersi su più righe senza problemi e l'attacco sarebbe fattibile.

Quindi, se una stringa JS con barre rovesciate senza escape è XSS-capable dipende molto dal contesto. Ma in molti casi avrai bisogno di almeno due punti di iniezione per inserire un carico utile dopo aver usato un \ per uscire da una stringa.

    
risposta data 11.10.2018 - 21:11
fonte

Leggi altre domande sui tag