Perché "! - script" in una stringa JS causa una pagina / denial of service danneggiata per quella pagina?

3

Ho avuto l'impressione che tutto ciò che dovevo fare per rendere sicuro JSON in linea consistesse nel rompere qualsiasi tag di chiusura </script> nelle stringhe, ad es. sfuggi al / come <\/script> .

Tuttavia ho trovato una strana combinazione che rompe ancora la mia pagina. Il testo "Non stamperà" non verrà stampato nella pagina. Il solo commento HTML va bene, il tag script va bene, ma la combinazione dei due è letale. Perché è così?

<!DOCTYPE html>
Before
<script>"<script>"</script>
fine
<script>"<!--"</script>
still fine
<script>"<!--<a>"</script>
fine again
<script>"<!--<script>"</script>
Won't print

Viene visualizzato come "Prima ancora bene ancora bene". "Will not print" verrà trattato come parte del tag script, che verrà trattato come non chiuso.

    
posta Adam A 03.09.2018 - 07:58
fonte

2 risposte

2

La risposta corretta a questo è "perché il parser HTML nelle specifiche dice così".

Dal normale "all'interno di uno script tag" stato , Un HTML l'inizio del commento ( <!-- ) inserisce il parser in uno stato di escape , e da quella modalità un tag di inizio script ( <script> ) inserisce in un double escape state in cui i tag di chiusura dello script ( </script> ) vengono ignorati.

Perché sulla Terra lo fa? Compatibilità con le versioni precedenti per l'inserimento di codice in browser che non supportano JS. Chaals dà un'ottima risposta sul link , e mostrerò il suo esempio di ciò che era una volta codice normale qui:

<script>
  <!--    //hide from non-JS browsers
  function doSomething() {
    var coolScript = "<script>" + theCodeICopied + "</script>";
    document.write(coolScript);
  }
  // And if you forget to close your comment here, things go funnny
  -->
</script>

Quindi ora siamo bloccati con questa vulnerabilità che rompe le pagine a meno che non sfugga entrambi i tag di script di inizio e fine.

    
risposta data 04.09.2018 - 11:59
fonte
0

Why does “<!--<script>” in a JS string cause an XSS vulnerability?

Open Open Brackets :

Submitted by Franz Sedlmaier, this XSS vector could defeat certain detection engines that work by first using matching pairs of open and close angle brackets and then by doing a comparison of the tag inside, instead of a more efficient algorythm like Boyer-Moore that looks for entire string matches of the open angle bracket and associated tag (post de-obfuscation, of course). The double slash comments out the ending extraneous bracket to supress a JavaScript error:

<<SCRIPT>alert("XSS");//<</SCRIPT>

Vedi anche il prossimo esempio a quel link: "Nessun tag di script di chiusura", avendo codice non valido come quello non corretto. Se quella fosse l'intera pagina e non contenesse nient'altro, non ci sarebbe stata una vulnerabilità XSS e non sarebbe stato mostrato nulla. Stai aprendo un commento e lo interrompi con un EOF, ecco perché non viene stampato nulla. Un ciclo do verrà sempre eseguito almeno una volta, anche se la condizione è falsa, perché il blocco di codice viene eseguito prima che la condizione venga testata; eseguirà tutto fino a un while e interromperà o terminerà il ciclo.

    
risposta data 03.09.2018 - 09:22
fonte

Leggi altre domande sui tag