XSS funciona cuando guardo el HTML generado en un archivo, pero no directamente en el navegador

1

Las sugerencias de level2 del juego XSS dicen que

  

Entrar en una etiqueta en este nivel no funcionará. Prueba un elemento   con un atributo de JavaScript en su lugar.

Al entrar

<script>alert(1)</script>

el HTML resultante después del envío es

<td valign="top" class="message-container"> 
  <div class="shim"></div>
   <b>You</b><span class="date">Wed May 18 2016 </span>
   <blockquote><script>alert(91)</script></blockquote>
</td>

y el XSS no se activa. Si lo sustituyo por

post-content=<img src='foobar' onerror='alert("xss")'>

se dispara!

He copiado todo el HTML en un archivo separado en mi computadora, ejecuté el primer caso y el script se activó.

Entonces, ¿qué es diferente del caso 1 al caso 2? ¿Debería el caso 1 funcionar también?

    
pregunta microwth 18.05.2016 - 20:37
fuente

1 respuesta

5

El código relevante para la generación de HTML es el siguiente:

for (var i=0; i<posts.length; i++) {
  var html = '<table class="message"> <tr> <td valign=top> '
    + '<img src="/static/level2_icon.png"> </td> <td valign=top '
    + ' class="message-container"> <div class="shim"></div>';

  html += '<b>You</b>';
  html += '<span class="date">' + new Date(posts[i].date) + '</span>';
  html += "<blockquote>" + posts[i].message + "</blockquote";
  html += "</td></tr></table>"
  containerEl.innerHTML += html;

Como podemos ver, el HTML se está configurando en el DOM a través de innerHTML , lo que significa que la etiqueta script no se ejecutará, porque por especificación, innerHTML no ejecuta scripts. Más información sobre por qué se puede encontrar en la pregunta de desbordamiento de pila script la etiqueta crear con innerHTML de un div no funciona .

  

He copiado todo el código HTML en un archivo separado en mi computadora, ejecuté el primer caso y el script se activó.

Es probable que haya copiado el HTML resultante, lo que significa que no fue creado por innerHTML , sino que permanentemente en la fuente HTML, por lo que se ejecutó.

    
respondido por el Alexander O'Mara 18.05.2016 - 20:59
fuente

Lea otras preguntas en las etiquetas