Am Ende der Seite finden Sie das komplette Beispiel als Download.
Systemvoraussetzung
- Linux
- Windows
- PHP 4 >= 4.0.3
- PHP 5
- CURLBibliothek
Datei(en)
curl_form.php, curl_formular.php, curlForm.sql
Problem
Wir haben Ihnen in einem vorangegangenen Beispiel (Captcha) gezeigt, wie
man den Unterschied zwischen einem Mensch und einer Maschine erkennt.
Wir wollen Ihnen im Folgenden demonstrieren, wie jemand, ohne auf Ihrer
Webseite gewesen zu sein, eines Ihrer Formulare beliebig oft ausfüllen kann.
Ein einziges Mal muss man dazu aber doch auf die Webseite, um sich den
Quellcode des Formulars anzuschauen. Danach läuft aber alles automatisiert.
Lösung
Die Lösung hierfür ist sehr trivial. Wir müssen lediglich unser vorheriges
Beispiel ein wenig modifizieren, und schon können wir uns überall eintragen. Voraussetzung dafür ist allerdings, dass das entfernte Formular keinen Schutz
wie zum Beispiel Captcha beinhaltet.
Alles, was wir machen müssen, ist, dass entfernte Formular einmal aufzurufen,
den Quellcode zu öffnen und nach den Variablen zu schauen. Diese Variablen
und die URL zum Formular ersetzen wir dann in unserem Programm. Fertig!
Hinweis
Bevor wir anfangen, den Programmcode zu erklären, möchte ich Ihnen ein
paar Worte vorweg sagen. Bitte missbrauchen Sie dieses Programm nicht für
illegale Zwecke, um z. B. mehrere 1000 Einträge in irgendwelchen Formularen
wie Foren, Gästebücher, Gewinnspiele zu machen.
Sie wissen schließlich nicht, was auf der Gegenseite mitprotokolliert wird!
Wenn man Ihre Verbindung zurückverfolgen kann, müssen Sie eventuell mit
empfindlichen Strafen rechnen! Dieses Programm soll Schwachstellen in Ihren
eigenen Formularen aufdecken, nicht Schwachstellen anderer Formulare!
Ich möchte Sie deshalb an dieser Stelle nochmals ausdrücklich darauf hinweisen,
diesen Programmcode nur auf Ihre eigenen Formulare anzuwenden!
function curlStart($domain, $var)
@param string $domain
@param string $var
@return bool $send
Die Funktion curlStart() erwartet als Parameter zum einen die URL zum
Formular und zum anderen die Variablen, die übermittelt werden sollen.
Wir initialisieren (36) anhand der URL zuerst eine neue Session und setzen im
nächsten Schritt einen Time-Out-Wert
(38) für diese Verbindung fest. Dieser
Wert sorgt dafür, dass alle nachfolgenden CURL-Funktionen
in dieser Zeit
abgearbeitet werden müssen.
Wird die Zeit überschritten, so endet die Verbindung. Sie können hier ruhig
einen kleineren Wert einstellen, da die kommenden Aktionen nicht viel Zeit
benötigen.
Da wir lediglich die Variablen absetzen wollen und uns die eventuelle Fehlermeldung
nicht interessiert, setzen wir den Parameter (40) für die Fehlermeldungen
auf 1. Sollten Sie die Fehlermeldungen allerdings benötigen, müssen Sie
hier einen Wert von 0 (Null) eintragen. Sie erhalten dann jeweils im Fehlerfall,
wenn der HTTP-Code
größer ist als 300, einen Fehlertext geliefert.
Wir müssen jetzt noch den Transfermodus berücksichtigen. Die angepingte
Webseite soll ja nicht in unserer Seite inkludiert, sondern nur abgefragt werden.
Aus diesem Grund setzen wir den Parameter (42) für den Transfer auf 1. Wenn
Sie hier eine 0 (Null) eingeben, so wird neben Ihrer Seite auch die Seite des
entfernten Hosts angezeigt!
Im nächsten Schritt überprüfen wir, ob der Funktion überhaupt eine Variable
übermittelt wurde. Falls ja, so wird für die Übermittlung der Variablen die
POST-Methode
(45) und anschließend der String für die Übermittlung der
Variablen gesetzt (46). Bei der Übermittlung per POST wird das Verfahren
„application/x-www-form-urlencoded“
genutzt.
Wir haben jetzt lediglich die Parameter gesetzt, müssen diese aber noch ausführen
(49). Aus diesem Grund sollten alle Parameter vorher gesetzt werden,
damit die initialisierte Session durch den Befehl curl_exec() (49) ausgeführt
werden kann.
Sollte der Server oder die Webseite nicht erreichbar sein, erhalten wir als Rückgabewert
entweder „TRUE“ (53) oder „FALSE“ (51). Wir speichern das Ergebnis
„TRUE“ (54) oder „FALSE“ (52) in eine Variable, schließen die Verbindung (57)
zum Server und geben die Variable an unsere aufrufende Stelle zurück (59).
34:
35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| function curlStart($domain, $var = false){
$fp = curl_init($domain); curl_setopt($fp,CURLOPT_TIMEOUT,10); curl_setopt($fp,CURLOPT_FAILONERROR,1); curl_setopt($fp,CURLOPT_RETURNTRANSFER,1);
if($var != false) {
curl_setopt($fp,CURLOPT_POST,1); curl_setopt ($fp, CURLOPT_POSTFIELDS, $var); } curl_exec($fp);
if(curl_errno($fp) != 0) {
$send = FALSE;
} else {
$send = TRUE; } curl_close($fp); return $send; } |
Beispiel 10.3: curl_form.php
Der restliche Teil ist relativ simpel und schnell erklärt. Sie müssen im ersten
Schritt die vollständige URL zum Formular angeben (63). Weiterhin benötigen
wir noch die Variablen (64). Wenn Sie sich den unten stehenden HTML-Quellcode
anschauen, so finden Sie dort zwei Variablen.
Um den Variablen einen Wert zuweisen zu können, müssen Sie ein Gleichheitszeichen
setzen:
vorname=Damir
name=Enseleit |
Da wir aber nur ein String benötigen, müssen wir die einzelnen Variablen
voneinander trennen. Hierfür dient ebenfalls die GET-Schreibweise,
und wir
trennen diese mit dem kaufmännischen UND (&).
Hier im Beispiel haben wir dann 50-mal
den Aufruf unserer Funktion durchgeführt
(67). Innerhalb von ein paar wenigen Sekunden wurden 50 Einträge in
der Datenbank gespeichert. 63: 64: 65: 66: 67: 68: | $formURL = 'http://www.nureinbeispiel4.de/curl_formular.php';
$var = 'vorname=Damir&name=Enseleit';
for($x=0;$x<50;$x++) {
$send = curlStart($formURL,$var); } |
Beispiel 10.4: curl_form.php
Wie bereits erwähnt, benötigen Sie nur die Formularnamen und die URL zu
dem Formular. Der nachstehende Quellcode der HTML-Seite
dient dabei der
Veranschaulichung.
Quellcode der fremden FormularSeite
18:
19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32:
33: 34: 35: 36:
37:
38: 39: 40:
41:
42: 43: 44: 45:
| <html>
<head> <title>Webformulare automatisiert ausfüllen lassen</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link href="formStyle.css" rel="stylesheet" type="text/css"> </head>
<body> <form name="form1" method="post" action="curl_formular.php"> <table width="100%" border="0" cellspacing="0" class="table"> <tr> <td width="7%">Vorname</td> <td width="93%"> <input name="vorname" type="text" class="inputField"
value="<?PHP echo $_POST['vorname']; ?>">
</td> </tr> <tr> <td>Name</td> <td><input name="name" type="text" class="inputField"
value="<?PHP echo $_POST['name']; ?>"></td> </tr> <tr> <td> </td> <td><input name="Submit" type="submit" class="button"
value="Abschicken"></td> </tr> </table> </form> </body> </html>
|
Beispiel 10.5: curl_formular.php
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
Download
|
Alle Beispiele als PHP-Datei(en)
Hier haben Sie die Möglichkeit, sich sämtliche auf dieser Seite gezeigten Beispiele als PHP-Dateien direkt downzuloaden.
Umständliches Copy & Paste ist daher nicht mehr notwendig, da alle Beispiele sofort ausprobiert werden können.
Sie haben bei der Auswahl der bereitgestellten Downloads mehrere Möglichkeiten, je nachdem welches Komprimierungsverfahren Sie bevorzugen.
|
Zurück zur Übersichtsseite
|