Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: 0x0309 en 13 Octubre 2009, 22:14 pm



Título: Ayuda con sistema de login
Publicado por: 0x0309 en 13 Octubre 2009, 22:14 pm
Hola, estoy intentando desarrollar un sistema de login en php, al parecer todo funciona bien, pero lo que no me funciona es el sistema anti session hijacking.
Quisiera saber si alguien me puede ayudar a encontrar el problema.

Para probar el csrf, una vez logueado con tamper data trato de enviar logout pero eliminando el t= Entonces dice csrf attempt.

Pero para probar session hijacking, no me funciona el tema del $fingerprint, una vez logueado, abro otra pestaña con firefox, y accedo a la url viendo el contenido exlusivo, si abro otra pestaña y accedo a la url, pero modificando el user agent, no se cae, diciendo session hijacking attempt, como que no cambia la cadena $fingerprint, y ese es el problema que tengo.

Si alguien por favor también pudiera darme sugerencias para hacer un buen sistema de login, se lo agradecería también.

Código
  1. //editado porque no estaba bueno. Abajo encuentran un código más decente.
  2.  


Título: Re: Ayuda con sistema de login
Publicado por: 0x0309 en 14 Octubre 2009, 01:16 am
Bueno, me respondo solo.

La solución fue comenzar a escribir todo de nuevo, pero basándome en funciones para así revisar y encontrar los errores.

Al final, no sé cual era el error, pero cree un código nuevo y funciona.

Este es el código, puede servirle a alguien.

/inc/auth.php
Código
  1. <?php
  2.  
  3. if (!defined('VER'))
  4. die('Hacking attempt...');
  5.  
  6. function sesionPorDefecto()
  7. {
  8.    cerrarSesion();
  9.    $_SESSION['logeado'] = false;
  10.    $_SESSION['anticsrf'] = 0;
  11.    $_SESSION['token'] = 0;
  12. }
  13.  
  14. function cerrarSesion()
  15. {
  16.    session_start();
  17.    session_unset();
  18. }
  19.  
  20. function estaLogeado()
  21. {
  22.    session_start();
  23.    if (isset($_SESSION['logeado'])
  24.        && $_SESSION['logeado'] === true) {
  25.        return true;
  26.    }
  27.    return false;
  28. }
  29.  
  30. function intentoCsrf()
  31. {
  32.    session_start();
  33.    if (!isset($_SESSION['anticsrf'])
  34.     || $_SESSION['anticsrf'] !== $_POST['t']
  35.     )
  36.    {
  37.     return true;
  38.    }
  39.    return false;
  40. }
  41.  
  42. function intentoSessionHijacking($fingerprint)
  43. {
  44.    if (estaLogeado()
  45.     && $_SESSION['token'] !== $fingerprint)
  46.    {
  47.     return true;
  48.    }
  49.    return false;
  50. }
  51.  
  52. ?>
  53.  
  54.  

/inc/filtros.php
Código:
es el code que se encuentra en:
http://foro.elhacker.net/php/filtro_sql_injection_y_filtro_xss-t270635.0.html
el foro no me deja postearlo.

/logout.php
Código
  1. <?php
  2. define('VER',1);
  3. require_once(dirname(__FILE__).'/inc/auth.php');
  4. require_once(dirname(__FILE__).'/inc/filtros.php');
  5.  
  6.  
  7. if (estaLogeado()
  8.   && !intentoCsrf())
  9. {
  10.    cerrarSesion();
  11.    echo 'Session closed.';
  12.    echo '<br/>';
  13.    echo '<a href="login.php">Go Login</a>';
  14.    die ();
  15. } else {
  16.    die ('Csrf attempt ...');
  17. }
  18.  
  19. ?>
  20.  

/login.php
Código
  1. <?php
  2. define('VER',1);
  3. require_once(dirname(__FILE__).'/inc/auth.php');
  4. require_once(dirname(__FILE__).'/inc/filtros.php');
  5.  
  6. $fingerprint = $fingerprint = md5('12345'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].'6789');
  7.  
  8. if (intentoSessionHijacking($fingerprint))
  9. {
  10.    cerrarSesion();
  11.    die('Session hijacking attempt ...');
  12. }
  13.  
  14.  
  15. if (!estaLogeado())
  16. {
  17.    if ($_POST['username'] && $_POST['password'])
  18.    {
  19. $username = antiSQLInjection($_POST['username']);
  20. $password = antiSQLInjection($_POST['password']);
  21.  
  22. //Hacer consulta en bd.
  23.  
  24. if ($username == 'carlos' && $password == 'entrar')
  25. {
  26.    $_SESSION['logeado'] = true;
  27.    $_SESSION['anticsrf'] = sha1('dfGFGsfsdf46433794bvcv' . uniqid(rand(), TRUE) . 'addsfFHf5efSAfr324');
  28.    $_SESSION['token'] = $fingerprint;
  29. }
  30.    }
  31. }
  32.  
  33. if (!estaLogeado())
  34. {
  35. ?>
  36.  
  37.    <form method='POST' action='login.php'>
  38.    <span>Username:</span>
  39.     <input name="username" type="text" maxlength="20" size="20" />
  40.    <span>Password:</span>
  41.     <input name="password" type="text" maxlength="15" size="20" />
  42.     <input name="login" type="submit" value="Login" />
  43.    </form>
  44.  
  45. <?php
  46. } else
  47. {
  48.    echo 'You are logged' . '<br/>';
  49.    echo '<a href="index.php">Go Home</a>';
  50.    echo ("
  51.    <form method='POST' action='logout.php'>
  52.        <input name=\"t\" type=\"hidden\" value=\"" . $_SESSION['anticsrf'] ."\" />
  53.        <input name=\"logout\" type=\"submit\" value=\"Logout\" />
  54.    </form>
  55.    ");
  56. }
  57. ?>
  58.