Ver Mensaje Individual
  #60 (permalink)  
Antiguo 04/07/2013, 15:10
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

CAPITULO 10

CROSS SITE REQUEST FORGERY

CSRF , digamos que es la capacidad para engañar a un usuario a que realice una accion sin su consentimiento, puede haber acciones de nivel bajo , cambiar idioma , cerrar la session etc... y mas serios como cambiar la contraseña , retirar fondos , cambio de direccion postal , compras etc........

Estos ataques suelen ser enviados a la victima mediante emails, redes sociales ,privados etc....

Para evitar este ataque y prevenir a los usuarios de falsas peticiones , vamos a generar un token de session generado en todas las peticiones.

A la practica pues....

1 mostrare un ejemplo vulnerable y despues veremos la implementacion del token

perfil.php

Código PHP:
Ver original
  1. <?php
  2.  
  3. if(isset($_SESSION['USUARIO']))
  4. {
  5.     // contenido del perfil
  6.         echo 'Bienvenido "'.$_SESSION['USUARIO'].'"';
  7.     echo '<a href="logout.php">salir</a>';
  8. }
  9. else
  10. {
  11.      echo 'no tienes suficientes permisos para ver esta pagina';
  12. }
  13. ?>

logout.php (vulnerable)

Código PHP:
Ver original
  1. <?php
  2. echo 'Has cerrado la session';
  3. ?>

ejemplo de ataque

Código PHP:
Ver original
  1. <html>
  2.  <body>
  3.   <p>una imagen muy chula amigo!!</p>
  4.   <img src="logout.php" style="display: none;">
  5.  </body>
  6. </html>

directamente cerrariamos la session ya que la imagen envia una peticion al servidor para acceder a logout.php y en logout no hay ninguna validacion de que el usuario halla pedido cerrar session.

soluciones

perfil.php

Código PHP:
Ver original
  1. <?php
  2.  
  3. if(isset($_SESSION['USUARIO']))
  4. {
  5.     $_SESSION['TOKEN'] = sha1(uniqid(mt_rand().session_id(), true));
  6.  
  7.     // contenido del perfil
  8.     echo 'Bienvenido "'.$_SESSION['USUARIO'].'"';
  9.     echo '<a href="logout.php?token='.$_SESSION['TOKEN'].'">salir</a>';
  10. }
  11. else
  12. {
  13.     echo 'no tienes suficientes permisos para ver esta pagina';
  14. }
  15. ?>

logout.php


Código PHP:
Ver original
  1. <?php
  2.  
  3. if(isset($_SESSION['USUARIO']) and isset($_SESSION['TOKEN']) and isset($_GET['token']) and $_GET['token'] == $_SESSION['TOKEN'])
  4. {
  5.     echo 'Has cerrado la session';
  6. }
  7. else
  8. {
  9.     exit('CSRF');
  10. }
  11.  
  12. ?>

Una vez implementado el token el ejemplo de ataque no tendria ningun resultado ya no se cerraria la session evitando asi CSRF.

Bueno eso es todo espero que sriva de inspiracion para crear buenas defensas CSRF.

Eso es todo sobre el capitulo 10 , si sabes otras maneras o mejorar lo expuesto o solo deseas mostrar tu opinion por favor exponlo.


Saludos nos vemos nuevamente con el capitulo 11.

1 - proteger directorios :link http://www.forosdelweb.com/f18/segur...ml#post4410846
2 - mensajes de error : link http://www.forosdelweb.com/f18/segur...ml#post4412140
3 - archivo de configuracion : link http://www.forosdelweb.com/f18/segur...ml#post4412159
4 - permisos y roles : link http://www.forosdelweb.com/f18/segur...ml#post4412275
5 - verificacion de archivos : link http://www.forosdelweb.com/f18/segur...ml#post4412596
6 - configuracion de sessiones : link http://www.forosdelweb.com/f18/segur...ml#post4416219
7 - session hijacking : link http://www.forosdelweb.com/f18/segur...ml#post4419281
8 - hash de contraseñas : link http://www.forosdelweb.com/f18/segur...ml#post4421471
9 - inyeccion sql : link http://www.forosdelweb.com/f18/segur...ml#post4451398

Última edición por webankenovi; 06/07/2013 a las 12:34