[Resuelto] [Pregunta]: Métodos captchas

Iniciado por Leguim, 26 Septiembre 2019, 00:24 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenas noches,
ayer estaba intentando crear el tipico captcha donde se muestra una imagen con una cadena aleatorio, por ejemplo "KSAX 934" pero supuestamente este método muy seguro que digamos no es, (además que me da errores y aparece todo negro [otro tema]) entonces pensé y pensé que sistema de captcha seguro podría hacer... Una idea que se me ocurrió era generar un valor random del 1 al 99, otro valor random del mismo rango, y otro random del 1 al 2...

entonces sería el primer valor random (A) y el segundo valor random (B)... por último el random de rango de 1 a 2 sería el tipo de operación (1 = suma y 2 = resta)
teniendo eso en cuenta ya podría  hacer el captcha...

Pero al final lo descarte porque no me parecio muy seguro tampoco (y otra que la experiencia del usuario bajaría muchisimo, en lo personal no me gustaría estar haciendo operaciones matematicas cada vez que deseo enviar algo a través de un formulario)

Como último se me ocurrió hacer que el usuario escriba lo que ve en X imagen, es decir ya no serían cadenas aleatorias, sino un dibujo... Un perro, gato, casa, arbol, etcétera..
y que el usuario escriba lo que tiene la foto (algo sencillo pero seguro)

Todavía para hacerlo más seguro se me ocurrió en vez de mostrar una imagen, muestre dos y más arriba diga "Escribe lo que ves en la imagen A" y para otro captcha podría decir "Escribe lo que ves en la imagen B" (sería random)

Quería leer opiniones. sugerencias, y criticas constructivas...

Otra duda que tenía era porque debería ponerse un captcha de strings random en una imagen, aunque me imagino que si estuviera el texto en el html el "atacante" podría simplemente copiarlo (igual nose...)

Gr acias...

engel lex

puede ser como este! XD





en general metodos matematicos no funcionan, las pc son mejores haciendo mates que los humanos...

hoy dia hay metodos "divertidos" implementados tambien hay mas humanos, por ejemplo haces una base de datos con multiples datos por objetos y hacer que la persona clickee el correcto, por ejemplo "dale comida al gato" y colocas un gatito en el medio y 6 objetos a su alrededor, un pescado, un brocoli, una manzana, un carro, una lupa y un perro... lo bueno de este metodo es que te permite tener multiples respuestas para un mismo acertijo y multiples acertijos para la misma respuesta, siendo todos muy humanos y dificil de automatizar... se puede hacer mas simple como "clickea la imagen relacionada" y listo

tambien te puedes hacer uno tipo la vieja presentacion de pokemon, colocas la silueta y preguntas "describe en una palabra que es esto?"

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Leguim

Claro lo que tenía pensado era eso decir que es lo que hay en la imagen con una sola palabra..
muestro la imagen de un gato (una imagen monocolor) y que la respuesta a esto sea "gato", el problema con esto sería la imagen png o jpge va a tener que tener un nombre digamos captchas/001.jpeg
y un atacan obtendría la ruta de la imagen 001.jpeg y diría bueno esta imagen es la de un gato sería...

Código (php) [Seleccionar]

if($ruta == 'captchas/001.jpeg')
{
     $la_respuesta = 'gato';
}


Aunque nose si un atacante puede llegar a hacer eso, igual me intereso esos captchas "clickleables" ¿como se llaman? así puedo ver como se hacen..

engel lex

Citarmuestro la imagen de un gato (una imagen monocolor) y que la respuesta a esto sea "gato", el problema con esto sería la imagen png o jpge va a tener que tener un nombre digamos captchas/001.jpeg

y entonces según esta logica los captcha de seleccionar image de google son inseguros XD

tu puedes procesar la foto por php y ponerle el nombre que quieras... o simplemente llamarla captcha.php y listo (para no compicarnos con htaccess)...

para esto en el script principal creas una variable de sesion y le introduces un valor estilo GUID, que contendrá la imagen verdadera, luego creas un array que asocie la imagen con el GUID, y luego N valores adicionales que hagan lo mismo, randomizas el array, de alli llamas a las imagenes por el script secundario y que creen las imagenes y luego vez si el valor retornado es el correcto

espero haberlo dicho de manera comprensible y en orden... aqui un PoC

Script principal (validar.php) aqui generamos las relacionas y las cargamos en el html
Código (php) [Seleccionar]
<?php 
// sacada de  https://www.php.net/manual/es/function.com-create-guid.php como alternativa
function guidv4(){ 
    if (
function_exists('com_create_guid') === true)
        return 
trim(com_create_guid(), '{}');

    
$data openssl_random_pseudo_bytes(16);
    
$data[6] = chr(ord($data[6]) & 0x0f 0x40); // set version to 0100
    
$data[8] = chr(ord($data[8]) & 0x3f 0x80); // set bits 6-7 to 10
    
return vsprintf('%s%s-%s-%s-%s-%s%s%s'str_split(bin2hex($data), 4));
}


$imagenes = [...]; // esto debe salir tal vez de una lista en tu DB al azar
$correcta guidv4();
$_SESSION['imagen_correcta'] = $correcta;
$mostrar = [$correcta => $imagenes [0]]; // guardamos la imagen correcta
for($i=1$i<=6$i++){
 
$mostrar[guidv4()] = [$imagenes [$i]]; //guardamos imagenes al azar
}  

$_SESSION['imagenes'] = $mostrar// guardamos las relaciones en la sesion

$keys array_keys($mostrar);// hacemos un array con los guids
shuffle($keys); // mezclamos el array para dejarlo al azar

foreach($keys as $key){
  echo 
"<button name='intento' value='$key'><img src='imagen.php?val=$key'></button>"// imprimimos las imagenes como botones
}
?>


aqui el segundo codigo, quien va a mostrar la imagen (imagen.php)
Código (php) [Seleccionar]
<?php 
$mostrar 
$_GET["val"]; //obtenemos el guid
$archivo $_SESSION['imagenes'][$mostrar]; // obtenemos el nombre del archivo
header("Content-type: image/jpeg"); // asumiendo que el archivo es .jpg/.jpeg
readfile($ruta.$archivo); //imprimimos el archivo al bufer de salida
?>


en general ahi la base del codigo... asume que ese codigo tiene partes antes y despues como el html inicios de sesion, etc...

espero que ayude
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Leguim


engel lex

a esto me refiero cuando digo que la web no es tan insegura como la apuntabas hace un tiempo y que del cliente se le puede dar todo lo que tu quieras sin arriesgar tu seguridad, siempre y cuando se haga bien del lado del servidor
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

@XSStringManolo

#6
Los bots pueden imitar a los humanos. Pero los humanos no pueden imitar a los bots.

Si intentas averigurar si es un humano, podría ser un bot o un humano.
Si intentas averiguar si es un bot, no puede ser un humano.

Mira los movimientos de cursor por la página. Le puedes poner un canvas, svg, o varios event listener a elementos con mouse over. Si se teleporta es un bot. Si va en linea recta perfecta es un bot. Si percorre la distancia en muy poco tiempo o va a tirones es un bot.

El capcha sería clickar 4 check boxes. Tras clickar cada checkbox usas un randomizador para situar el siguiente en un sitio aleatorio. Y compruebas la distancia recorrida. Si se hacen parones regulares. Si se percorre perfecto en varios trozos, velocidad de trazado, etc.

El tema está en que no se sepa que comprobaciones haces.

El tema de usar imágenes es horrible. Pueden simplemente hacer software para obtener las imágenes que usas en tus captchas. Tu esas imágenes las quitas de algún sitio. Se puede buscar en Google la imagen e introducir todas las palabras de la página original en la que sale la imagen y los tags asociados a ella en un array.
Cada vez que me salga esa foto mete una palabra distinta. Cuando la encuentre la guarda en un archivo de texto.

O podría hacer unas cuantas a mano y guardar las palabras y meterlas sin ni siquiera saber que imagen estas metiendo.
Entro a tu web, me sacas una foto de un perro de captcha, y solo tengo que decirle al bot:

Código (javascript) [Seleccionar]
MantenerBucle=true;
while(ManternerBucle)
{
NuevaPestañaUrl("www.example.com/captcha.php");
Input = "TAB, TAB, TAB, TECLA(p), TECLA(e), TECLA(r), TECLA(r), TECLA(o), ENTER";
MandarInput(Input);
Sleep(3000);
  if (PestañaUrl == "www.example.com/captcha.php")
  {
  Input ="Control + TECLA(o)";
  MandarInput(Input);
  }
  else {MantenerBucle = false;}
}
//Acceso Obtenido.


En algún momento volverás a sacar la imagen del perro y obtendré acceso. Si después de X números de accesos bloqueas la IP, se podría usar Tor para obtener una nueva identidad cuando bloqueas el bot o meterle una lista de proxychains.

También tendrías que tener cuidado con el generador pseudoaleatorio. Podría tenerse revisión de que imagenes usas. Si metes una semilla fija, te tiran el server y te piden captcha. Miran la imagen.

Hacen un bot con la palabra correspondiente a esa imagen. Te tiran el server y meten la palabra xD.

Lo mejor es que prohibas acceso por cuenta y no dejes al usuario no registrado hacer nada qie te pueda perjudicar. Cada 10 intentos fallidos seguidos bloqueas las cuentas asociadas al email y pones una dirección de correo de soporte para desbloquear el email.

Algo tipo: Se detecto actividad sospechosa en tu cuenta y por seguridad fue bloqueada. Si es un error envia un correo electrónico a soporteCaptcha@example.com indicando el problema para volver a activar tu cuenta.




Mod: Obligatorio el uso de etiquetas GeSHi para codigos.


engel lex

a string Manolo siempre llendosele la mano XD lo que dices no es falso, pero usualmente es totalmente inviable, requiere mucho desarrollo y tiempo para algo que economicamente no lo vale y a demás que se iria a la basura con un par de pequeños cambios de parte del servidor XD...

Citarusas un randomizador para situar el siguiente en un sitio aleatorio. Y compruebas la distancia recorrida. Si se hacen parones regulares. Si se percorre perfecto en varios trozos, velocidad de trazado, etc.

está mas que probado que esto es facilmente violable, porque a demás asumes que están usando un navegador con el bot XD, patrones "humanos" son faciles de hacer, es cosa de tener unos pocos y aplicar mezclas y operaciones matematicas para expandirlos a infinitos (o uno solo y siempre aplicarlo XD)

CitarEl tema está en que no se sepa que comprobaciones haces

oscuridad no es seguridad

lo siguiente, asumes que un bot va a hacer un intento cada 3 segundos, usan IA, te hacen DDoS, tor,  etc... y te digo, inviable en tiempo a menos que el objetivo sea algo muy valioso y que de igual si puedes obtener 1 resultado cada varios dias
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

#!drvy

@string Manolo, me hace mucha gracia porque hace unos posts le decias a Miguel que reCaptcha era poco seguro y aquí estás sugiriendo comprobaciones que ya están implementadas en reCatpcha pero a lo básico y poco eficiente  :laugh:


@Miguel, sinceramente, aprende todo lo que quieras sobre captchas, hay muchas cosas interesantes y muchos métodos guays, pero a la hora de la verdad, invertir tanto en un captcha que luego no va a ser ni el 20% de eficaz/seguro/accesible de lo que va a ser uno donde se han invertido millones como puede ser reCaptcha. Te doy un ejemplo muy básico, qué harás para los usuarios que necesitan accesibilidad, digamos por ejemplo, una persona ciega?


Para aprender esta genial hacerse un captcha, y aún más divertido es luego intentar saltarselo (vease ocr, bruteforce, bypass etc), pero en un entorno en producción, usa algo que ya está requete testado.



Saludos

Leguim

¡Les agradezco mucho a los 3!
Si, ya decidí usar recaptcha v2 de google y ya me corre de 10!
¡Muchas gracias, otra vez!