# Captcha "umgehen", Bild Aufruf per fsockopen()



## TS-JC (3. November 2007)

Hallo

Ich habe mich mal an diesen Captchas versucht und wollte mal gucken wie die funktionieren und wie man die sozusagen umgehen kann.

Als Beispiel diese Seite, da kann man das am leichtesten testen weil man nur 2 Sachen eingeben muss.
https://www.vodafone.de/proxy42/portal/registration.po

Also das Script umgeht den Captcha nicht, sondern blendet nur den Captcha ein und das Formularfeld, der Rest der Formulardaten ist egal.

Problem an meinem Script ist aber irgendwie das ich nicht wirklich wieder erkannt werde und die Prüfung nach dem Code irgendwie nicht stattfindet.

Naja, vielleicht kann ja mal jemand einen Blick drauf werfen und sieht wo der Fehler ist, ich tippe aufs Cookie, aber habe keine Ahnung wie ich das anders machen sollte.


```
<?php

function getSite ($host,$url,$data_to_send,$referer,$cookie) {
	$res = "";
	$fp = fsockopen($host, 80);
	fputs($fp, "POST /$url HTTP/1.0\n");
	fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QXW03411; i-NavFourF)\n");
	fputs($fp, "Host: $host\n");
	fputs($fp, "Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\n");
	fputs($fp, "Accept-Language: de\n");
	fputs($fp, "Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\n");
	fputs($fp, "Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\n");
	fputs($fp, "Connection: Keep-Alive, TE\n");
	fputs($fp, "TE: deflate, gzip, chunked, identity, trailers\n");
	if ($referer != '')
		fputs($fp, "Referer: $referer/rn");
	fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
	if ($data_to_send != '') {
		fputs($fp, "Content-length: ". strlen($data_to_send)+1 ."rn"); // +1 weil der Server sonst meckert
		fputs($fp, $data_to_send);
	}
	if ($cookie != '')
		fputs($fp, "Cookie: ".$cookie."\r\n\r\n");
	fputs($fp, "Connection: close\n\n");
	while(!feof($fp)) {
		$res .= fgets($fp, 128);
	}
	fclose($fp);
	return $res;
}


if (!isset($_GET[ code ])) {

	$host = "www.vodafone.de";
	$url = "/proxy42/portal/registration.po";

	$res = getSite($host,$url,"","","");
	
	// Cookie auslesen
	if(strpos($res, 'Set-Cookie: ')!== false) {
          $cookie = substr($res, strpos($res, 'Set-Cookie: ')+strlen('Set-Cookie: '), strpos($res, "; path") - strpos($res, 'Set-Cookie: ') - strlen('Set-Cookie: '));
       }
	
	// TOKEN auslesen
	$buffer = strstr ($res, "org.apache.struts.taglib.html.TOKEN");
	$end_buffer = strstr ($buffer,"\"></div>");
	$buffer = str_replace ($end_buffer,"",$buffer);
	$buffer = substr($buffer,44);

	// Bild holen
	$image = getSite ("www.vodafone.de","/proxy42/securityCode.jpg","","https://www.vodafone.de/proxy42/portal/registration.po",$cookie);
	$image = substr($image,strpos($image,'image/jpeg')+14);
	$filename = "temp.jpg";
	$fp = fopen($filename,"w");
	fwrite($fp,$image);
	fclose($fp);

	// Formular anzeigen
	echo "<img src=http://localhost/rebo/$filename>";
	echo "<hr>";
	echo "<FORM ACTION=$_SERVER[PHP_SELF] METHOD=get>";
	echo "<INPUT TYPE=text NAME=code SIZE=10>";
	echo "<INPUT TYPE=hidden NAME=token VALUE=$buffer>";
	echo "<INPUT TYPE=hidden NAME=cookie VALUE=$cookie>";
	echo "<BR><BR>";
	echo "<INPUT TYPE=submit NAME=SUBMIT VALUE=Abschicken>";


} else { // wenn Code eingeben wurde
	
	$host = "www.vodafone.de";
	$url = "/proxy42/portal/registration.po";
	$data_to_send = "customer=true&name=015204277653&securitycode=".$_GET[ code ]."&register.x=Weiter%A0";
	$data_to_send .= "&org.apache.struts.taglib.html.TOKEN=".$_GET[token];
	$referer = "https://www.vodafone.de/proxy42/portal/registration.po";
	$cookie = $_GET[cookie];

	$res = getSite($host,$url,$data_to_send,$referer,$cookie);
	
	if (strstr($res,"Der eingegebene Sicherheitscode ist nicht korrekt"))
		echo "Falscher Code";
	elseif (strstr($res,"Bitte legen Sie einen Benutzernamen fest"))
		echo "Code OK";
	else {echo $cookie."<hr>"; echo $res; }
}
?>
```


----------



## TS-JC (4. November 2007)

Hat niemand ne Ahnung?
Bin verzweifelt, bekomms nicht hin :-(


----------



## Gast (28. Juli 2009)

Ich glaub die Zeile:

fputs($fp, "Content-length: ". strlen($data_to_send)+1 ."rn"); // +1 weil der Server sonst meckert

ist falsch, da fehlen zwei \

also richtig:

fputs($fp, "Content-length: ". strlen($data_to_send)+1 ."\r\n"); // +1 weil der Server sonst meckert

Grüße


----------

