¿Puede un sitio web realizar una solicitud HTTP a "localhost"? ¿Cómo hace para eludir la política de dominios cruzados?

13

Encontré este sitio web que habla sobre cómo corregir una vulnerabilidad de Redis al explotando esa misma vulnerabilidad.

El sitio web en cuestión tiene un botón "parcharme" y, si tiene un servidor Redis sin contraseña en ejecución en su máquina, lo parchará.

En otras palabras, el sitio web mismo se conecta al servidor Redis en su computadora y ejecuta algunos comandos.

Si observa el código del sitio web que encuentra, como era de esperar:

    var text = "the code to run";
    var bad = "EVAL "  + JSON.stringify(text) + " 0\r\n";
    var x = new XMLHttpRequest();
    x.open("POST", "http://localhost:6379");
    x.send(bad);

Para mi sorpresa, ¡esto funciona!

Pensé que la Política de dominios cruzados impediría que esto se ejecutara, pero no lo hace.

¿Por qué funciona esto y cómo no puedo ser tan paranoico que todos los sitios web en los que entro están leyendo todo el contenido de mi servidor Redis?

¿Es porque solo se escribe pero no se lee? Sin embargo, cualquier sitio web del mundo podría vaciar mi servidor Redis local / escribir en cualquier otra cosa escuchando un puerto en mi máquina sin autenticación.

¿Me estoy perdiendo algo aquí?

    
pregunta Daniel Magliola 19.06.2015 - 15:27
fuente

1 respuesta

4

Para responder a la pregunta: Sí, un sitio web puede realizar una solicitud HTTP a localhost. No romperá la política de dominios cruzados, porque la solicitud no cruzará dominios. Se mantendrá local. Una forma de evitar las políticas de dominios cruzados, es hacer que la víctima objetivo realice la solicitud HTTP. Por lo tanto la solicitud nunca cruza dominios.

Para ayudarlo a comprender el problema que describió:

El ataque no está enviando ningún dato, ni está haciendo una conexión a ningún otro lugar que no sea la máquina Redis local. No es el sitio web que se conecta a su máquina Redis. Es usted conectado a su máquina Redis, ejecutando el código / scripts del lado del cliente que usted ejecutó al hacer clic en el enlace. Básicamente: haz clic en el enlace > Enlace descargado y ejecuta algún código - > código genera una solicitud http - > La solicitud http va desde su máquina a su máquina.

La vulnerabilidad del servidor Redis en esta situación es la falsificación de solicitudes entre sitios. El atacante aprovecha la autenticación de las víctimas (en este caso, el propietario del servidor) para ejecutar el ataque.

El atacante no tiene control total sobre el proceso. Confían en el propietario del servidor Redis para ejecutar el código. Solo el propietario (u otra persona local del servidor de Redis) tiene la visibilidad (y quizás el permiso y la relación de confianza) para acceder a 127.0.0.1 (Localhost)

Todo lo que el código puede hacer es ejecutar comandos que el usuario local puede ejecutar, pero no es el atacante quien los ejecuta, es el propietario, por lo que no se infringen las Políticas de dominios cruzados.

Las únicas personas afectadas por vínculos de este tipo serían las personas que ejecutan servidores Redis. Si no tienes uno, el enlace no hará nada. Además, solo se ejecutará en el servidor Redis local. El atacante realmente no puede elegir dónde ocurrirá el exploit.

Buscar falsificación de solicitudes en sitios cruzados. enlace

    
respondido por el meltdownmonk 19.06.2015 - 16:03
fuente

Lea otras preguntas en las etiquetas