Muchas veces necesitamos hacerle un bypass a alguna
captcha, como puede ser
Re-captcha.
Lo primero que se nos ocurre es usar algun
OCR (Reconocimiento óptico de caracteres) para detectar las letras de la imágenes. El problema esta que no puede funcionar correctamente y en muchos casos no logra procesar la imagen. Quizás por eso no sea algo muy típico, ni muy utilizado con esto fines.
Podemos desarrollar nuestro propio
OCR, pero a la larga seria un proceso muy complejo y necesitaríamos invertirle mucho tiempo. Muchos simplemente descartan el proyecto.
Otros lo que harían seria buscar alguna vulnerabilidad en la
captcha, que de alguna forma les permita saber que imagen es y que letras tienen. Algunos buscarían una vulnerabilidad en la validación de la
captcha que seria un proceso igualmente largo ya que tienen que entender el funcionamiento de la
captcha y comenzar a probar...
Yo estaba realizando una
App web y debía realizar acciones y tomar algunos datos de un sitio web, pero este utilizaba
Re-captcha para poder identificarse/loguearse. Se me ocurrieron todas las opciones que menciones y otras pero no relacionada directamente con la
captcha.
Aquí tengo una solución universal para cualquier Captcha. La solución mas rápida y segura, es utilizar la misma captcha que el sitio web.Osea, la imagen genera la
captcha la capturo y la muestro en mi sitio web para que los usuarios que vayan a utilizar la
App web, inserten el código de la
captcha y mi App web realice todo.
Al final tengo una
App web, que realiza lo que quería hacer y utiliza
captcha. No tengo que implementar alguna captcha en mi servicio ya que con la
captcha del sitio web me basta.
Bypass de Re-Captcha<?php
require_once('recaptchalib.php');
$publickey = "6Lc55McSAAAAAChEOICK8IX0V6zRh3CD64ix6jbx";
$privatekey = "6Lc55McSAAAAAB4ny39PlgX8gjMvm2x7SsrXEb6y";
if(!empty($_POST['nombre'])) {
$is_valid = recaptcha_check_answer($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
if($is_valid->is_valid) {
echo '<p><h1>Captcha Valida</h1></p>';
}else{
echo '<p><h1>Captcha invalida</h1></p>';
}
}
?>
<form method="POST" name="form" action="a.php">
<p>Mensaje:
<input type="text" name="nombre"></p>
<?php echo recaptcha_get_html($publickey); ?>
<input type="submit" value="enviar">
</form>
Realizare el código para hacerle el bypass.
<?php
//Si se envio el formulario, compruebo el el input
//donde se inserte la captcha, contenga algun valor
if(!empty($_POST['captcha_valude'])) {
$data =' nombre='.$_POST['mensaje'].'&recaptcha_challenge_field='.$_POST['cod'].'&recaptcha_response_field='.urlencode($_POST['captcha_valude']);
echo post('http://127.0.0.1/a.php', $data);
}
//Fin del poc para el bypass
//Obtengo la imagen de la captcha y luego la muestro....
$contenido = get('http://127.0.0.1/a.php');
preg_match('/ipt" src="(h[^"]+)/', $contenido, $result);
preg_match('/challenge :[sn]+'([^
']+)/i', get
($result[1]), $cont);
$img = 'http://www.google.com/recaptcha/api/image?c='.$cont[1];
echo '<IMG src="'.$img.'">';
//Fin...
//Funcion para realizar peticiones GET
function get($url) {
return $result;
}
//Funcion para realizar peticiones POST
function post($url, $contenido) {
return $result;
}
?>
<!--Formulario-->
<form action="aa.php" method="POST">
<p>Inserte el contenido de la captcha</p>
<p><input type="text" name="captcha_valude"></p>
<p>Inserte el mensaje
<input type="text" name="mensaje"></p>
<input type="hidden" name="cod" value="<?php echo $cont[1]; ?>"><!--Codigo de la captcha-->
<input type="submit" value="Enviar">
</form>
Al rellenar todos los datos correctamente, me da por valida todo.
Probar el
PoC, así entienden mejor todo.
Saludos.