¿Cerrar un elemento HTML sin usar barras literales?

12

Estoy investigando una vulnerabilidad en una aplicación que se hace eco de un nombre de archivo provisto por el usuario sin sanear el nombre de archivo.

Por ejemplo, un archivo llamado test-<script>alert("evil");.txt dará como resultado que el texto se haga eco en el XHTML. (En caso de que importe, este documento en particular se sirve como texto / html y el tipo de documento es xhtml1-transicional).

El problema es que la etiqueta <script> no se puede cerrar porque el nombre de archivo no puede contener / . Esto significa que la secuencia de comandos no se ejecuta porque todo lo que sigue es parte de la secuencia de comandos, y todo ese HTML no será válido JS.

(FWIW, también estoy investigando el uso de subdirectorios como una forma de incluir la barra oblicua en la aplicación, pero parece recortar el nombre de archivo del archivo antes de mostrarlo. Heh: tener un archivo llamado ./<script>alert("evil subdir?");</script>.txt hace Me siento un poco mareado ...)

Basándome en algunas hojas de trucos de XSS , he intentado varias formas de codificar la barra diagonal para que pueda aparecer en el nombre del archivo, pero aún así debe ser interpretado por el analizador HTML como una etiqueta de cierre. Sin suerte; los caracteres se insertan literalmente en el HTML sin ningún tipo de codificación / decodificación intermedia.

Incluso sin la barra diagonal, he encontrado tres o cuatro formas de explotarla, pero hasta ahora requieren la interacción del usuario con ese elemento (por ejemplo, onmouseover ). También hacen que la página sea fea porque la estructura de la etiqueta se deshace. Si puedo cerrar la etiqueta, el exploit es invisible y automático.

¿Existen técnicas estándar (es decir, evasión del filtro XSS) para cerrar una etiqueta sin las comillas que me faltan?

    
pregunta bstpierre 18.11.2011 - 18:36
fuente

1 respuesta

12

Aquí hay algunos más que puedes probar. Apuesto a que uno de estos funcionará (de hecho, apuesto a que el primero funcionará, y luego puedes dejar de leer):

  • Prueba <img src="" onerror="alert(0)"> . No hay interacción del usuario involucrada.

  • Te estás rindiendo demasiado fácilmente en onmouseover . Cree un elemento gigante que cubra la mayor parte de la página y luego use onmouseover . Aunque técnicamente la interacción con el usuario está involucrada, creo que puede hacerlo casi automático.

  • Prueba onreadystatechange , por ejemplo, <iframe onreadystatechange=alert(0)> . Es solo para IE (IE7 y posteriores, creo) pero poderoso .

  • Prueba onfocus="alert(0)" autofocus , por ejemplo, <input autofocus onfocus=alert(0)> . No sé si esto funcionará.

  • En Opera, intente <table background=javascript:alert(0)> . Puede que funcione .

  • Pruebe <img src="javascript:alert(0)"> y <iframe src="javascript:alert(0)"> (es poco probable que funcione en la mayoría de los navegadores, pero puede intentarlo).

  • Si el servidor no especifica el tipo de codificación de contenido en los encabezados de la respuesta HTTP, intente UTF -7 shenanigans (solo funciona en navegadores antiguos).

Tenga en cuenta que es probable que estas técnicas sean altamente dependientes del navegador.

Si todavía está atascado, intente preguntar en Sla.ckers ; hay un montón de gente que anda por ahí que están muy bien informados sobre este tipo de cosas. Para lo más básico, recomiendo la hoja de trucos de XSS de RSnake . Para obtener vectores XSS más avanzados, intente blog de Gareth Heyes y Sla.ckers.

    
respondido por el D.W. 18.11.2011 - 19:08
fuente

Lea otras preguntas en las etiquetas