TP6 por Pepe Vila (7 de enero de 2014) "Client side attacks: the browser way." 0x0 - Indice 0x01 - Introducción 0x02 - XSS 0x03 - CSRF 0x04 - Clickjacking 0x05 - HTML Injection 0x06 - Conclusión 0x01 - Introducción Posiblemente la herramienta que más utilizamos cada día es un navegador, ya sea Firefox, Chrome, Safari o Internet explorer. Y aunque tratemos de hacer una navegación segura siempre vamos a estar expuestos a algunas amenazas. Tanto desde el punto de vista del usuario que quiere saber que pasa cuando navega, como desde del desarollador que quiere asegurar que su software sea seguro, en los siguientes puntos voy a tratar de abordar las distintas vulnerabilidades y ataques que afectan a los clientes web a día de hoy. He procurado hacer pocos supuestos sobre los conocimientos previos, así que creo que todo el mundo debería poder seguir sin dificultad los puntos. Para aquellos con más conocimientos en los enlaces podrán encontrar referencias a documentos que profundizan más. En cualquier caso es la primera vez que escribo un documento así, de modo que estoy abierto a críticas y sugerencias para mejorarlo. Por último, espero también que este texto pueda servir de toma de contacto para aquellos que quieran interesarse en este mundo. :) 0x02 - XSS + Overview Los ataques de Cross-site-scripting han sido muy conocidos desde hace muchos años, el primer paper[1] sobre el tema es del año 2002 y todavía hoy siguen siendo los más comunes (top 3) según OWASP[2]. Además, debido a la tendencia de llevar todos los servicios a la web, cada vez son más peligrosos ya que no solo ha aumentado la superfície de ataque sino que somos capaces de realizar tareas y acceder a información mucho más crítica. A resumidas cuentas, se trata de un ataque que explota la confianza de un usuario en el servidor web, permitiendo ejecutar código Javascript en el navegador de la víctima bajo el contexto de su sesión en el dominio de la web vulnerable. Esto significa que el atacante será capaz de realizar cualquier acción que pudiera realizar el usuario legítimo (a través de envíos de formularios o peticiones ajax), acceder a cualquier información visible para la víctima, robar sesiones y llevar a cabo una suplantación, modificar la apariencia de la página para forzar al usuario a realizar acciones o para simplemente mermar la reputación del sitio. En definitiva, las posibilidades son infinitas, basta con ver el ejemplo de Samy[3], el primer gusano XSS que infectó más de 1 millón de usuario de MySpace en menos de 24 horas (agregando a su autor como amigo y replicandose a través de los muros de las víctimas). En función de las técnicas y el entorno de explotación, se clasifican en 4 subgrupos: reflected, persistend, dom y mutated. + Reflejados La primera variante, y posiblemente la más fácil de evitar, son los conocidos como XSS reflejados. El fallo radica en el incorrecto o inexistente saneamiento de los datos de entrada del usuario: ya sean parámetros GET, POST, cookies, cabeceras... Y que de algún modo son mostrados, o reflejados, en la página. Veamos un ejemplo (se puede ver el código fuente de los scripts cambiando la extensión por .phps): http://hendrix-http.cps.unizar.es/~a594190/xss/reflected.php?name=Manuelo Como se puede ver, el servidor devuelve una página con el valor del parámetro GET 'name' incrustado en el cuerpo (ver código fuente de la página), indistingible del resto del html que procesa nuestro navegador. De modo que alguien podría tratar de insertar el siguiente valor: http://hendrix-http.cps.unizar.es/~a594190/xss/reflected.php?name= Esto nos devolvería una página HTML con un tag script ejecutando la alerta. Y del mismo modo, podría incluirse un script remoto que ejecute cualquier código arbitrario. Aunque este es un vector muy simple de ejemplo, hay cientos de formas de ejecutar Javascript en un navegador. Veremos algunas más adelante. La manera de llevar a cabo el ataque consiste en forzar a la víctima a visitar el enlace malicioso a la página vulnerable. Aunque muchas veces no hace falta hacer click en un enlace, simplemente visitando una página que creamos inofensiva, puede redireccionarnos o cargar en un iframe oculto la página con el XSS y ejecutar el código malicioso. Desafortunadamente, no existe una solución única para evitar este tipo de ataques. Dependiendo de la aplicación, framework o lenguaje usado, vamos a tener unas herramientas u otras, y unas necesidades determinadas. Y aún así, dependiendo del contexto en el que se de la inyección, vamos a tener que preocuparnos de unas cosas o de otras. Vamos a ver 3 posibles contextos de ejemplo: HTML, atributo y event handler. Pero teniendo en cuenta que hay muchos más. En el primero, que es el del ejemplo, va a ser necesario abrir una etiqueta para poder ejecutar código, ya sea