jueves, febrero 12, 2015

No me mires el User-Agent que te meto un XSS {o un SQL Injection}

Es un hecho que el método más común y utilizado por las aplicaciones web para conocer el tipo de navegador usado por cada cliente se basa en el valor de la cabecera HTTP User-Agent que se envía desde el propio web browser. Como este es un campo que cualquiera puede modificar, desde hace muchos años se estudian diferentes formas de averiguar el navegador exacto que es mediante las técnicas de web browsing fingerprinting de las que desde hace ya más de siete años se les comenzó a dedicar algún artículo en este mismo blog.

Figura 1: No me mires el User-Agent que te meto un XSS {o un SQL Injection}

A pesar de que en la navegación web del día a día, la información de esta cabecera pase desapercibida para el usuario medio, el navegador está constantemente enviando información sobre sí mismo como la versión exacta del software, el motor de renderizado, etcétera, algo que no siempre gusta a la gente de seguridad, ya que también se filtra información sobre el propio sistema operativo, como la versión y la arquitectura del mismo.

Figura 2: Cabecera HTTP User-Agent enviada por defecto desde un Firefox en Windows

El valor de User-Agent y la seguridad informática


Este exceso de información en el valor del User-Agent tiene muchas connotaciones desde el punto de vista de la seguridad, ya que para un Kit de Explotación es fácil identificar el exploit concreto que se debe ejecutar, o qué tipo de ataque client-side se puede lanzar a un determinado usuario, sobre todo si hablamos de dispositivos móviles.

Debido a estas posibilidades, muchos navegadores de Internet cuentan con extensiones y complementos que permiten hacer spoofing de la cabecera User-Agent y establecer un valor personalizado, que puede usarse desde para pretender ser otro navegador, simular ser el bot de Google y ver menos publicidad en los periódicos, detectar infecciones de BlackSEO haciendo cloaking o auditar el código de una web mostrado a los distintos motores de renderizado.

Además, para las aplicaciones web, esta cabecera aporta gran cantidad de información sobre el cliente, por lo que es habitual almacenarla permanente para posteriormente obtener estadísticas de los navegadores más utilizados, sistemas operativos de los usuarios, dispositivos, versiones de software, etcétera. Por lo tanto, se puede considerar a la cabecera User-Agent como un parámetro más de entrada, al igual que lo es un parámetro querystring, y como tal se debería validar en caso de utilizarlo, ya que como dijo Michael Howard:
 "All input is Evil until it proves otherwise"
Ya hemos visto en el pasado exploits de Time-Based Blind SQL Injection ejecutados a través de valores User-Agent, y una manera sencilla de comprobar si el programador de una web está capturando esta cabecera y validándolo correctamente, es instalarse un complemento para modificar la cabecera User-Agent y establecer un valor que debería filtrarse.

Figura 3: Complementos para spoofear el valor de User-Agent

Un test de XSS con inyecciones en la cabecera User-Agent

Para esta demostración he instalado en Mozilla Firefox - se escoge Firefox por no tener filtro Anti XSS - un complemento que permita cambiar el User-Agent. Este complemento queda accesible desde el menú Herramientas y permite elegir un User-Agent entre algunos configurados por defecto, o añadir uno personalizado. Para el caso a tratar, hay que añadir uno nuevo, accediendo al menú ‘Edit User Agent’.

En la nueva ventana se muestran los diferentes valores de User-Agent configurados en el complemento. Desde aquí se pueden añadir nuevos, borrar los existentes o editar cada uno de ellos. Pulsando el botón ‘New’ aparece una ventana, donde hay que definir el nuevo User-Agent. Lo único necesario es establecer en el campo ‘Description’, el nombre que se desee que tenga el nuevo User-Agent. Dicho nombre aparecerá en el menú del complemento para seleccionarlo cuando se quiera utilizar. Para esta demostración se establece el nombre ‘XSS Alert’ y en el campo ‘User Agent’ se introduce el valor que se desea enviar en la cabecera. Como la demostración trata de comprobar si las webs validan entradas maliciosas, se introduce el valor <script>alert('User Agent XSS')</script>

Figura 4: Creando un valor de User-Agent con inyección de un XSS clásico

Lo único que queda es acceder al menú Herramientas, y seleccionar el User-Agent recién creado. Ahora hay que buscar una página web que interprete el script que se ha indicado en la cabecera. Para ello, desde el navegador he realizado una búsqueda con las palabras "What Is My User Agent" y he ido accediendo a las páginas webs que se han encontrado en los primeros resultados. Los primeros que aparecen son webs dedicadas simplemente a mostrar el valor de User-Agent con el que se ha realizado la petición.

Figura 5: Búsqueda de sitios web que muestran el valor del User-Agent

El resultado del experimento ha sido bastante curioso, pues de una primera página con sitios devueltos desde Google con 10 URLs, en 3 de ellas aparecerá una bonita ventana de alerta con el texto 'User Agent XSS', un claro reflejo de que a día de hoy queda mucho camino por recorrer en materia de concienciación de seguridad.

Figura 6: Uno de los sitios que se come el XSS en el campo User-Agent

Viendo esto, si tienes una aplicación web que captura estadísticas y las mete en una base de datos o las muestra por un portal web de administración, comprueba muy bien el valor que te pueda llegar, no te vayas a comer un XSS o algo peor.

Autor: Ioseba Palop
Ingeniero Faast (Eleven Paths)

3 comentarios:

  1. Parece que han solucionado el problema en la página que lo probaste, he cambiado mi UA manualmente en chrome y al intentar entrar en la página me tiraba un error por el UA.
    Un saludo.

    ResponderEliminar
  2. "Que te meto un /ks//s//s/" suena genial. De todas formas no experimenté con él (En mi lab, no seáis quinquis) más allá del robo de cookies o la inyección del hook.js de beef.
    Podíamos hacer un pequeño tallercillo, ¿no?
    Hacklab virtual con VMware Player gratis (me gusta más a la hora de emular x64 y conectar dispositivos USB) y a jugar.

    ResponderEliminar
  3. Hola, como puedo hacer para eliminar la información del User-Agent , como la de "ASP.NET", "ASP.NET VERSION", "IIS", para que ya no sea parte del USerAgent ? Gracias

    ResponderEliminar