Captcha de jquery RealPerson.js

Iniciado por clandrews, 23 Marzo 2015, 20:56 PM

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

clandrews

Cordial Saludo señores.

Requiero hacer una consulta para una empresa que maneja bases de datos donde solo tienen el documento, hay una pagina que esta disponible a todos donde coloca el documento y aparece unos datos que requiero para incluirlo en un campo de una base de datos, el problema es que su captcha esta en jquery con el plugin RealPerson.js y eso me dificulta hacer mi sistema automatizado. He estado buscando toda la mañana formas y maneras pero veo que había una vulnerabilidad donde con fuerza bruta lograban entrar pero no se si en ese entonces los captcha no cambiaban cuando se generaba una consulta fallida.

Les agradezco su atención, les pido su colaboración. Como les digo no quiero hacer un mal ni me interesa hacerlo solo quiero agilizar con buenas practicas un proceso que se hace manual donde se pueden pasar días y dias para terminar una labor cuando en minutos podría tenerlo.

Gracias a todos, bendiciones..

engel lex

no hay mucho que hacer, en tal caso pide a los de IT que hagan una api para el acceso
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.

WHK

#2
Vamos, esa captcha es muy fácil de bypasear por dos razones, una que la captcha no interactua con el servidor para generar el código válido asi que el código se está generando por navegador y no por servidor. Segundo, todas las letras son iguales, o sea, la letra R siempre va a tener la misma forma asi que solamente buscas el patrón de los puntos y listo.

Veamos como funciona:
Entramos a la pagina web de pruebas de la captcha:
http://keith-wood.name/realPerson.html

Si vemos el código fuente veremos que el plugin genera un hash el cual debe ser comprado por php para saber si tu texto coincide con la captcha, en este caso el hash es la suma de un "salt" y el valor de la captcha, pero que es el salt? es un texto obtenido por el mismo sitio WEB hacia un archivo externo:
http://keith-wood.name/rpSalt.php

Mucho ojo, es necesario mantener las cookies entregadas por este archivo, estas cookies deben ser enviadas en respuesta a la solicitud final del servidor ya que el sitio WEB guarda el salt en una sesión de php el cual está identificada en una cookie (PHPSESSID).

Ahora veamos el algoritmo para que generemos nuestro propio hash:

Código (javascript) [Seleccionar]
inst.hash = hash(text + salt);

/* Compute a hash value for the given text.
  @param value {string} The text to hash.
  @return {number} The corresponding hash value. */
function hash(value) {
var hash = 5381;
for (var i = 0; i < value.length; i++) {
hash = ((hash << 5) + hash) + value.charCodeAt(i);
}
return hash;
}


Y listo, ya tenemos toda la información necesaria para engañar al servidor, ahora cada ves que necesites enviar tu documento a validar en tu sitio web con esa captcha antes de eso debes revisar en el código fuente del portal hacia que archivo se está solicitando el salt, luego en tu robot haces que haga la solicitud primeramente a ese archivo y obtienes el valor y la cookie y luego con ese salt te generas tu propio hash sumando la captcha con el valor hash(AAAAAA + salt) y luego lo mandas via postdata de esta manera:

defaultReal=AAAAAA&defaultRealHash={hash}

Claramente la manera de generar el hash dependerá de tu lenguaje de programación ya sea en c#, php , python, java, etc, por lo menos ya tienes el algoritmo en javascript, ahora lo debes traducir al lenguaje de tu robot :)


Vamos a la práctica:

1.Creamos un robot que ingresa a http://keith-wood.name/rpSalt.php , en mi caso el valor del salt fue "29310" (recordemos guardar la cookie, en mi caso es PHPSESSID=segfcli9fos1ok4ea1p3ufr5t2) .

Ahora inventemos el valor de la captcha, en mi caso el valor será EKEAGF y le hago la suma:
Código (php) [Seleccionar]
echo getHash('EKEAGF'.$salt);

El valor entregado es -2431022777 , esto quiere decir que para mi la captcha EKEAGF tiene valor de hash igual a -2431022777 asi que ahora enviaré mi consulta HTTP a traves de mi robot con esos datos mas la captcha:

http://keith-wood.name/realPerson.php

POST /realPerson.php HTTP/1.1
Host: keith-wood.name
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0
Cookie: PHPSESSID=segfcli9fos1ok4ea1p3ufr5t2;
Connection: close
Type: application/x-www-form-urlencoded
Content-Length: 46

defaultReal=EKEAGF&defaultRealHash=-2431022777


y listo!

CitarYou have entered the "real person" value correctly and the form has been processed.

Es mas, me acabo de dar cuenta de una falla de seguridad de la misma captcha por parte del script en php, y es que el archivo rpSalt.php siempre entrega el mismo código y es reutilizable :) , ese plugin no tomó la precaución de destruir la sesion o el valor del token al ser utilizado asi que esto es aun mas fácil, basta con que entres con un navegador normal y entres a ese archivo y captures el valor y la cookie, luego le das al robot esos dos valores y se lo mandas junto con tu archivo a revisar :) ya que el valor siempre será el mismo.

Mira acá tienes un código en javascript para generar el hsh a partir de un valor y un salt:

Código (javascript) [Seleccionar]
captcha_inventada = "AAAAA";
salt = 29310

value = captcha_inventada + salt;
var hash = 5381;
for (var i = 0; i < value.length; i++) {
hash = ((hash << 5) + hash) + value.charCodeAt(i);
}
console.log(hash);



Como debería funcionar una captcha segura?

Normalmente una captcha bien hecha como recaptcha genera una imagen no un texto o puntos y el servidor es el encargado de generarla y darla a mostrar y el valor real debe viajar a través del navegador y no generarla el mismo navegador y el transporte debe ser de manera oculta o cifrada como un hash de una cookie el cual indica el lugar donde se encuentra el hash real en el servidor no el valor en si, de esta manera previenes que el  hash pueda ser manipulado o generado como lo hicimos nosotros. Otro punto importante es que una captcha jamás debe poder ser reutilizada, esto quiere decir que si ves dos veces una captcha la primera debe ser invalidada inmediatamente y cuando se resuelve debe ser destruida, también se debe considerar que las imágenes nunca se alojan ni se pasan por el disco del servidor, siempre se generan y se despliegan en tiempo real, esto previene que el servidor colapse por exceso de archivos si te lanzan un ataque de denegación de servicio distribuido (ddos).

Esto crea un ambiente seguro entre el dueño de la información y el usuario final.


Ahora, si quieres mi recomendación personal te digo que sigas el consejo de engel lex y pidas el acceso como corresponde al administrador del sitio y que tarde o temprano cuando noten que hay un proceso automatizado te van a cambiar la captcha o te van a llamar la atención. Toma esta situación como una oportunidad de aprender mas sobre las captchas nada mas, cuando te toque hacer una sabrás como hacerlo bien.

Saludos.