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