XSS: doppia quota e backslash di escape

2

Attualmente sto testando il mio filtro XSS e non so se ho pensato a tutto, quindi ho bisogno di un consiglio.

Diciamo che il mio codice assomiglia a questo:

<script>
var test = {src: "test", layer: {"input": "USER INPUT", "event": "ready"}};
</script>

In questo caso specifico, se sostituisco \ con \ e " con \" è possibile ingannare il mio filtro? Ovviamente l'input dell'utente sarà dove USER INPUT è nel mio codice.

    
posta Evo_x 10.10.2017 - 20:10
fonte

1 risposta

8

In this specific case, if I replace \ with \ and " with \" is it possible to trick my filter?

Non è sufficiente, il tuo filtro non è sicuro.

Ad esempio, un vettore di attacco XSS valido sarebbe </script><svg onload=alert(1)> , per finire con:

<script>
var test = {src: "test", layer: {"input": "</script><svg onload=alert(1)>", "event": "ready"}};
</script>

Poiché l'albero XML (HTML) viene analizzato prima della valutazione di qualsiasi JS, il tag di script di chiusura ( </script> ) termina lo script nonostante venga inserito in una stringa JS.

Un altro problema con il filtro sono interruzioni di riga. Se un utente malintenzionato può inserire un byte 0x0a , può interrompere lo script causando un errore di sintassi (poiché una stringa con doppia quotatura non può estendersi su più righe):

<script>
var test = {src: "test", layer: {"input": "
", "event": "ready"}};
</script>

Se stai usando PHP, una comoda funzione di filtro per lavorare in sicurezza con l'input dell'utente all'interno di JS è json_encode() . Da questa risposta :

With plain PHP a common and safe approach is to use json_encode() as explained here. E.g.:

var foo = <?php echo json_encode($foo, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>

json_encode() returns the JSON representation of a value, hence it's guaranteed to evaulate to a valid object in your JS code and you can just assign it to a variable as shown. But don't omit the additional flags. Depending on the context, an attacker could otherwise use payloads like </script> to break out of the entire script tag.

    
risposta data 10.10.2017 - 20:34
fonte

Leggi altre domande sui tag