Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: tecasoft en 6 Mayo 2013, 21:45 pm



Título: [Resuelto] Tokens por sesion para hacer mas dificil falsificar peticiones
Publicado por: tecasoft en 6 Mayo 2013, 21:45 pm
komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones web? y seria dificil o imposible el falsificar peticiones web? gracias


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: #!drvy en 6 Mayo 2013, 22:33 pm
Para empezar, los tokens sirven para prevenir CSRF.
http://en.wikipedia.org/wiki/Cross-site_request_forgery

Ahora, esto no previene que el atacante haga un script donde el se conecta a tu pagina, captura el token y te lo envía en su próxima petición. Por tanto, le da cierta seguridad al usuario, pero no hace dificil/imposible que se puedan realizar peticiones web.

El token no suele ser mas que un md5/sha1/string aleatorio. La pagina que vaya a solicitar la acción se lo manda a la que realiza la acción. Esta comprueba si es valido y en tal caso, realiza la acción.

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: tecasoft en 6 Mayo 2013, 22:38 pm
pero si yo mando 123 x $_SESSION y en la otra web esta apuntado 123 y compara si es verdad o no, debe ser imposible hacer peticiones desde el exterior con un formulario no?yo lo entiendo asi


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: #!drvy en 6 Mayo 2013, 22:42 pm
La session al fin y al cabo no es mas que una cookie.. (y no voy a explicar porque xD). Si yo hago un script, que se connecte a la primera pagina, guarde la cookie PHPSID y vaya a la segunda pagina mostrando la cookie, el token sera totalmente valido.

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: tecasoft en 6 Mayo 2013, 23:24 pm
a vale ya voy entendiendo algo, dices,que la cookie la guardara y es la misma que en el otro caso, es decir podria navegar no? y que se podria hacer con esa cookie? con ejemplo me entiendo mejor, ya sabes cosas de la informatica



me podriais responder,eske ando atascado en esto de los tokens, me podeis poner algun ejemplo,os lo agradeceria bastante,gracias.

Mod: No hacer doble post.


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: xustyx en 8 Mayo 2013, 16:20 pm
Lo que puedes hacer que supongo que ya sabrás és, generar todos los formularios con el input hiden del token con php a partir de un string random pasado a md5 y guardado en la db a la hora que un usuario logea, entonces cuando te llega la peticion post miras el user y miras si el token es el que tiene asignado, tambien puedes mirar el referer y ver que la peticion se realizo de una url deseada.

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: #!drvy en 8 Mayo 2013, 16:44 pm
Yo creo que con un token aleatorio por cada acción a realizar va de sobra. Así incluso aunque tu script resulte vulnerable y alguien es capaz de capturar el token (algo que pasa en ciertas versiones de SMF...) no le servirá mas que 1 vez...

Tal y como te ha dicho @xustyx, la idea es generar el token y añadirlo como un campo hidden al formulario.
Código
  1. <?php
  2. // Generar un sha1 aleatorio.
  3. $token = sha1(rand(0,999).rand(999,9999).rand(1,300));
  4. $_SESSION['token'] = $token;
  5.  
  6. ?>
  7. <!doctype html>
  8. <html>
  9. <head>
  10. <meta charset="utf-8">
  11. <title>PoC</title>
  12. </head>
  13. <body>
  14.    <form action="post.php" method="POST">
  15.        <input type="text" name="usuario" />
  16.        <input type="password" name="password" />
  17.        <input type="hidden" name="token" value="<?php echo $token; ?>" />
  18.        <input type="submit" value="Enviar" />
  19.    </form>
  20. </body>
  21. </html>

Luego en la pagina que va a recibir el formulario y/o realizar la accion, compruebas antes el token..
Código
  1. <?php
  2. // Comprobar si el session o el post del token estan vacios y compararalos para ver si coinciden.
  3. if(empty($_SESSION['token']) || empty($_POST['token']) || $_SESSION['token']!==$_POST['token']){
  4.   die('Tu token no es valido. Realiza tu consulta de nuevo. Si eres un juanker, que sepas que me tire a tu mami anoche.');
  5. }
  6. echo 'Tu consulta ha sido realizada';
  7. ?>

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: tecasoft en 12 Mayo 2013, 00:24 am
os mereceis un  ;-)
ahora por cierto el $_POST['token'] no seria mejor antes pasarle un antiddos(la longitud del campo con un length) o tambien pasarle un anti code injection(filtrar lista blanca con numeros y letras)

es que podria ser que puedan cambiar algo en el codigo y ejecutarlo de forma malintencionada no? vosotros veis esas posibilidades?


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: #!drvy en 14 Mayo 2013, 04:32 am
Suponiendo que la máxima longitud de un sha1 son 40 caracteres en hex, solo se compone de números 0-9 y letras de la a a la f...

Código
  1. <?php
  2. // Comprobar si el session o el post del token estan vacios y compararalos
  3. // para ver si coinciden.
  4. if(empty($_SESSION['token']) || empty($_POST['token'])
  5.   || !preg_match('/[0-9a-f]/',substr($_POST['token'],0,40))
  6.   || $_SESSION['token']!==$_POST['token']) {
  7.   die('Tu token no es valido. Realiza tu consulta de nuevo.');
  8. }
  9.  
  10. echo 'Consulta valida';
  11. ?>

Aunque... lo que mas te puede pasar es que tengas una configuración tan jodida que PHP permita meter 1-2GB en $_POST... lo que haría que tarde unos cuantos segundos mas en procesar nada mas creo yo.. xD


Citar
antiddos(la longitud del campo con un length

Fiarse de un input con length por seguridad... es como comprarse esta pistola y rezar que no te mate...
(http://i291.photobucket.com/albums/ll301/hammerz71/SuicidePistol.jpg)

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: tecasoft en 14 Mayo 2013, 20:05 pm
pues hay un pequeño problema en el campo del formulario al crear el $_SESSION caduca la session al cabo de 30 o 40 min y me da error,envede consulta con exito,me caduca la session entonces tendre que hacerlo con un $_SERVER['HTTP_REFERER'], x lo visto se me soluciona con el referer,veis algun inconveniente que utilice el referer solo?


Edito: donde supuestamente esta el formulario, es donde va un editor web(para que los usuarios metan javascript,html,pero lo k yo kiera,es decir un wysiwyg) pasaria algo con un XSS que me puedan secuestrar cookies propias o de algun user,estando desde el editor web,repito hago yo lo k kiera cuando lo introduzcan* en formato web* NO en html puro codigo*, perdonar si me explicado mal


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: #!drvy en 14 Mayo 2013, 21:12 pm
Citar
veis algun inconveniente que utilice el referer solo?

Si... es spoofeable y hay usuarios/navegadores que no lo mandan para que les sea mas difícil hacerles seguimiento.. es una cabecera de la que no hay que fiarse..

http://www.php.net/manual/es/function.session-set-cookie-params.php

PD: También puedes pasar la session por URL...
http://php.net/manual/es/session.idpassing.php

Saludos


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: tecasoft en 14 Mayo 2013, 22:27 pm
http://www.php.net/manual/es/function.session-set-cookie-params.php en el php.ini me marca 1440 es decir 24 minutos pero lo he probado y tarda unos 30 o 40 minutos eso xk es?



ha quedado asi y funciona a la perfeccion el ejemplo,gracias x la colaboracion:

Código
  1. <?php
  2. // Generar un sha1 aleatorio.
  3. $token = sha1(rand(0,999).rand(999,9999).rand(1,300));
  4. $_SESSION['token'] = $token;
  5.  
  6. ?>
  7. <!doctype html>
  8. <html>
  9. <head>
  10. <meta charset="utf-8">
  11. <title>PoC</title>
  12. </head>
  13. <body>
  14.    <form action="post.php" method="POST">
  15.        <input type="text" name="usuario" />
  16.        <input type="password" name="password" />
  17.        <input type="hidden" name="token" value="<?php echo $token; ?>" />
  18.        <input type="submit" value="Enviar" />
  19.    </form>
  20. </body>
  21. </html>
  22.  

Código
  1. <?php
  2.  
  3.  
  4. if(empty($_SESSION['token']) || empty($_POST['token']) || !preg_match('/[0-9a-f]/',substr($_POST['token'],0,40)) || $_SESSION['token']!==$_POST['token'] || $_SERVER['HTTP_REFERER'] !== "http://192.168.1.2/prueba/tokens_referer/enviar.php")
  5. {
  6.   echo 'Los tokens o el referer no son correctos.';
  7. }
  8. else
  9. {
  10. echo 'Tu consulta ha sido realizada';
  11. echo "<br>";
  12. echo $_SERVER['HTTP_REFERER'];
  13. }
  14. ?>
  15.  

Mod: No hacer doble post.


Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: boxccs en 13 Diciembre 2014, 17:21 pm
Buenas, estoy intentando entender un poco sobre los tokens pero el formulario de ejemplo que coloco tecasoft, no le veo el mas mínimo sentido, se está usando el token como un capcha ? O algo así? Que tipo de seguridad podría aportar?




Título: Re: komo se hacen tokens por sesion para hacer mas dificil el falsificar peticiones
Publicado por: daryo en 13 Diciembre 2014, 17:37 pm
es para evitar una vulnerabilidad web conocidad como csrf. http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery


imagna que yo quiero hacer que cierres sesion, cambies tu clave o cualquier cosa en un foro entonces yo te envio un enlace como este.

http://foro.elhacker.net/logout.html

lo abres y ya sin querer cerraste sesion(bue es un ejemplo pero se pueden hacer cosas mas peligrosas xD)

pero si la pagina en cuestion pidiera tokens es decir una secuencia de caracteres aleatoria que cambia por cada inicio de sesion entonces tu abres el link y amenos que tengas el token no pasa nada

el token de sesion que tengo ahora y el enlace tendria que ser asi (diferente por cada sesion)xD:
http://foro.elhacker.net/logout.html;sesc=XXXXXX