[ + ] Información del Paper [ + ] Cross Site Request Forgery [ CSRF / XSRF ] Autor: Tec-n0x ;) Fecha: 03/4/2008 Www.Editcodex.NET Contacto: Tec-n0x [ at ] hotmail [ dot ] com ====================================== [ + ] Indice [ + ] = > 0x001 < = => Introducción = > 0x002 < = => Como funciona el CSRF / Pequeño ejemplo = > 0x003 < = => Codeando una Aplicación Vulnerable = > 0x004 < = => Evitando el CSRF = > 0x005 < = => Despedida ====================================== [ + ] Introducción [ + ] Bueno, en este paper vamos a hablar sobre lo que es CSRF / XSRF [ Cross Site Request Forgery ] . Intentare explicar todo lo posible sobre esta vulnerabilidad y lo mas importante .. Como prevenir estos ataques. Empezemos .. =) ====================================== [ + ] Como funciona el CSRF [ + ] Bueno, en el CSRF el atacante trata de " Forzar " algún codigo malicioso aprovechandose de una sesión abierta o no caducada de la victima para asi lograr que la victima haga lo que nosotros queramos. [ + ] Definición mas Completa ( Gracias C1c4Tr1Z ) : [ + ] Un ataque basado en la utilización de html que realicen mediante una petición HTTP GET una acción directa (ej: ) o una acción indirecta (ej: ) , utilizando un archivo HTML que realice peticiones POST/GET, sin que la víctima de este ataque de su consentimiento o aprobación, ya que es un ataque que actúa silenciosamente. Este ataque puede a su vez aprovecharse de cookies (activas o caducas) o a la vez realizar acciones que no las utilicen en cualquier tipo de web. [ + ] Pequeño Ejemplo [ + ] Bueno, digamos que estamos logueados en un foro .. y un usuario nos manda un mensaje privado diciendonos algo como : " Hola, mira que buen tutorial de C++ .. [ Clic Aqui < = URL Maliciosa ] " Y digamos que cuando el usuario clickee en el link lo va llevar a una pagina mas o menos como esta: http://site.com/foro/index.php?action=logout Esto cerraría la sesión del usuario .. pero que pasaría si en vez de cerrar la sesión del usuario pudieramos cambiar alguno de sus datos como su email / password .. ====================================== [ + ] Codeando una aplicación Vulnerable [ + ] Esta aplicación será una cuenta .. Digamos que es un hosting de imagenes llamado " MyHosting " ... Y si queremos cambiar nuestros datos ( Email / password, etc ) .. Tenemos un formulario como el siguiente: // Index.php ==================================================================
Usuario Email Contraseña Email alternativo:
================================================================== // Fin Index.php =========================================== ================================================================== // Datos.php ================================================================== Entonces, a la hora de cambiar nuestros datos .. tendriamos una url mas o menos como esta: http://http://myhosting.com/Datos.php.php?usuario=Tec-n0x&email=mymail@gmail.com& contraseña=mypass123&emailalternativo=mymail2@gmail.com Entonces, aqui esta el peligro ... Que pasa si estamos logueados en la página .. y un usuario nos manda un link y lo vemos .. que contiene un codigo como este: ================================================================== Hi ================================================================== Si el usuario estuviera logueado en Myhosting.com y la victima viera esta página .. ¿Que pasaría? Se enviaría una petición HTTP a MyHosting y se cambiarían los datos del usuario .. =========================================== [ + ] Evitando el CSRF [ + ] Bueno, vamos a usar como ejemplo MyHosting .. Tenemos el index.php ( Le he añadido un campo llamado "actualcontraseña " ) ==================================================================
Usuario Email Contraseña Email alternativo: Contraseña Actual:
================================================================== Un archivo llamado " config.php " que va a conectar a la bd: ================================================================== ================================================================== Y El archivo " datos.php " pero .. modificado: ================================================================== ================================================================== Lo que hariamos en este caso sería seleccionar Desde la BD la contraseña actual en la tabla myhosting_usuarios desde el campo " contraseñaa " si es diferente .. No se cambian los datos, si la contraseña coincide .. se realiza la operación .. en este caso .. hacer un update a la tabla " myhosting_usuarios " cambiando los datos del user. Obviamente si quieren probar code en localhost van a tener que crear una bd y modificar la función que cambia los datos del user ... Pueden usar esta consulta SQL .. ================================================================== CREATE TABLE `myhosting_usuarios` ( `id` int(11) NOT NULL auto_increment, `usuario` varchar(15) NOT NULL, `email` varchar(15) NOT NULL, `emailalternativo` varchar(15) NOT NULL, `contraseña` varchar(150) NOT NULL, `contraseñaa` varchar(150) NOT NULL, KEY `id` (`id`) ) ENGINE=MyISAM; INSERT INTO `myhosting_usuarios` VALUES (1, 'Tec-n0x', 'mymail@gmail.com', 'mymail2@gmail.com', 'mypass', 'mypass'); ================================================================== Otra forma de prevenir estos ataques .. sería usando CAPTCHA .. Aqui un codigo: ================================================================== 47 && $random<58) ){ $str.=chr($random); } } return $str; } $text = $_SESSION['string']=strrand(5); $img_number = imagecreate(47,17); $backcolor = imagecolorallocate($img_number,244,244,244); $textcolor = imagecolorallocate($img_number,0,0,0); imagefill($img_number,0,0,$backcolor); imagestring($img_number,50,1,1,$text,$textcolor); header("Content-type: image/png"); imagejpeg($img_number); ?> ================================================================== Creamos un campo de texto llamado code ================================================================== ================================================================== Y Comprobamos que el codigo sea valido .. ================================================================== if($_POST['code']!=$_SESSION['string']){ echo "Error en el codigo de seguridad "; exit(); } ================================================================== =========================================== [ + ] Despedida [ + ] Bueno, espero que les haya servido este paper sobre CSRF =) Gr33tz t0: Celciuz, You_kn0w, C1c4Tr1Z, N.O.X, H-Black, lEnergy, Syst3m-c0der, etc =) Www.Editcodex.NET Saludos, Tec-n0x ;)