lunes, 18 de marzo de 2019

Jugando con XSS, Cookies y CORS

Muy buenas a todos,

el otro día estaba discutiendo con alguien como de peligrosa puede llegar a ser una XSS, a donde ese "alguien" argumentaba que en caso de ser una aplicación sin usuarios el riesgo de una XSS no será ninguno.

A esto tengo que decir que no es del todo cierto y voy a explicar por qué, este post será tan solo teórico para explicar algunos conceptos y entenderlos bien, pero no haré una prueba de concepto como suelo hacer para que podáis jugar.

El caso en el que me enfocaba yo para poder decir que una XSS en un lugar sin usuarios es el caso de que existan subdominios que si tuvieran usuarios (lo cual es algo muy común).



Para entender como podrías atacar a un subdominio a través de una XSS en el dominio principal hace falta saber en que consisten los siguientes dos valores de las cookies:

  • HTTPOnly: Este valor indica si JavaScript puede o no interactuar con una cookie, es el valor que indica si podremos hacer un robo de sesión a través de una XSS o no.
  • Domain: Este valor indica el domio de la cookie en cuestión. Cuando un subdomio crea una nueva cookie tiene la opción de hacerlo como "subdominio.dominio.int" o como ".dominio.int"
En el caso de que el el flag del dominio apunte a ".dominio.int", cualquier parte del dominio entero podría acceder a ella, de esta forma sería posible robarla en caso de tener el flag "HTTPOnly" desactivado con una XSS en una parte del dominio sin autenticación.

Además de esto existiría otro vector de ataque, este sería a través de peticiones "XMLHttpRequest" en AJAX.

Esto es una explotación ya conocida en las XSS, el ataque consistiría en obtener la respuesta de una petición, por ejemplo "modificarPerfil.html", obtener el token CSRF, y una vez con este enviar otra petición a "modificarPerfil.php" para poder evadir esta medida de seguridad.

Para evitar que esto se pudiera hacer desde un dominio malicioso se crearon las CORS, que son unas cabeceras del servidor que le dicen a tu navegador si el tratamiento de estas peticiones se debe o no hacer dependiendo de donde provenga esta petición.


En principio, si el servidor no indica nada no se podrán realizar estas peticiones (ya sea desde un dominio externo o un subdominio), la cuestión es que pueden estar implementadas varias cabeceras que indican desde donde se podrían realizar estas peticiones.

  • Access-Control-Allow-Origin: Indica desde que dominio se pueden realizar peticiones de tipo XMLHttpRequest.
  •  Access-Control-Allow-Credentials: Esta cabecera indica si se puede o no enviar las cookies a la hora de realizar estas peticiones.


Como veis es necesario que se especifique que se pueden realizar peticiones desde este dominio, sin embargo no es extraño encontrarse estas cabeceras, ya que al ser un dominio del que también se tiene control se trata como un dominio seguro.


Por hoy ya he terminado, ha sido una explicación un poco superficial pero espero que hayan quedado claros los conceptos, para cualquier duda o búsqueda de más información podeis comentar.

También me podéis seguir en Twitter para ver nuevos Posts y así echarme de paso una manita.

Saluti.

Ci no configurah vien lah cosah po te jaqueo.

No hay comentarios: