Encontré una vulnerabilidad XSS reflejada que analiza el código HTML, pero si pones un corchete de cierre, el filtro lo elimina.
¿Hay algún código para una prueba de concepto que pueda ejecutar sin ningún corchete de cierre (>)?
Gracias
¿Hay algún código para una prueba de concepto que pueda ejecutar sin ningún corchete de cierre (>)?
No, las etiquetas normales no funcionan sin un corchete de cierre. Sin embargo, puedes usar comentarios.
Si el tokenizer de su navegador se adhiere a la especificación de sintaxis HTML del W3C (que deberían ser los navegadores modernos), no emitirá un token de etiqueta a menos que proporcione un corchete de cierre ( >
). Puede confirmar esto buscando las transiciones de estado en el tokenizer .
Digamos que inyectas <script
, lo que significa que ahora estás en Estado del nombre de la etiqueta . Aquí están tus opciones:
8.2.4.10 Tag name state Consume the next input character: "tab" (U+0009) "LF" (U+000A) "FF" (U+000C) U+0020 SPACE Switch to the before attribute name state. "/" (U+002F) Switch to the self-closing start tag state. ">" (U+003E) Switch to the data state. Emit the current tag token. Uppercase ASCII letter Append the lowercase version of the current input character (add 0x0020 to the character's code point) to the current tag token's tag name. U+0000 NULL Parse error. Append a U+FFFD REPLACEMENT CHARACTER character to the current tag token's tag name. EOF Parse error. Switch to the data state. Reconsume the EOF character. Anything else Append the current input character to the current tag token's tag name.
Solo >
emite el token de la etiqueta, pero no tienes permiso para usarlo. Si el documento termina allí ( EOF
), está generando un error de análisis y no está emitiendo el token. Una excepción a ese comportamiento son los comentarios y las declaraciones de DOCTYPE.
Ahora digamos que ingresas a la Estado del comentario a través de <!--
. Entonces estas son las opciones:
8.2.4.48 Comment state Consume the next input character: "-" (U+002D) Switch to the comment end dash state U+0000 NULL Parse error. Append a U+FFFD REPLACEMENT CHARACTER character to the comment token's data. EOF Parse error. Switch to the data state. Emit the comment token. Reconsume the EOF character. Anything else Append the current input character to the comment token's data.
Como puede ver, un final de archivo aún emite el token de comentarios. Así que incluso si no puede cerrar una etiqueta, puede insertar un comentario que comente el siguiente texto. Además, se emitirán tokens DOCTYPE ( <!DOCTYPE
) y básicamente cualquier cosa que comience con <!
.
Obviamente, si su punto de inyección está rodeado por alguna etiqueta HTML, no tiene que cerrar la etiqueta usted mismo, ya que cualquier >
posterior se aplicará y lo hará por usted. @tim ha dado un ejemplo para eso en su respuesta.
Eso depende del resto de la página. Si contiene un corchete de cierre, es probable que lo uses para cerrar cualquier etiqueta que hayas abierto.
Un ejemplo sería:
<img src=no onerror=alert(1) foo= // the input
<div>example</div> // the rest of the page
Lo que se ejecutaría al menos en Chrome y Firefox.
Las siguientes inyecciones de XSS se ejecutarán sin ninguna etiqueta de cierre adjunta.
<body/onload=alert(1)
<svg/onload=alert(1)
<iframe/onload=alert(1)
En cuanto a por qué esto sucede, no estoy seguro. Alguien más podría responder eso, pero funciona.
Ejemplo de Fiddle: enlace
Lea otras preguntas en las etiquetas xss