Donnerstag, 20. Juli 2006

Partyguide: Die Abstimmung

Zurecht werden sich meine Leser seit Montag gefragt haben, wo denn eigentlich nun die versprochenen Resultate der Umfrage unter meinen Leser bleibt?

Klar, werden meine Kritiker sagen: Die Resultate sind niederschmetternd, deshalb veröffentlicht er sie nicht. Falsch. Oder: think eMeidi benötigt noch ein wenig Zeit, um die Resultate zu fälschen. Seine abgrundtiefe Bösheit hat er ja bei drei Partyguide-Hacks unter Beweis gestellt – wieso sollte er hier anders handeln?

Nun, um es kurz zu machen – nichts von alledem ist wahr. Hier sind die Resultate:

  • Ja, such dir endlich ein richtiges Hobby! – 22
  • Nein, ohne Partyguide-Hacks ist das Leben todlangweilig! – 41

Quelle: Resultate der Umfrage

Das Resultat ist nicht berauschend, aber ich hätte nicht gedacht, dass mein Tun bei der Mehrheit der Abstimmenden nicht auf unverständliches Kopfschütteln stösst, wie das Partyguide-Fanboys immer darstellen möchten.

Scripts richtig absichern

Natürlich wäre es lächerlich, derart über die Unfähigkeit der Partyguide-Programmierer herzuziehen, und dann dieselben Böcke zu schiessen wie Oberprogrammierer Jason und seine Argonauten. Ich habe deshalb die bei mir üblichen Sicherheitsstandards auch bei diesem Mini-Script angewendet. Ich schlage vor, dass Jason und seine Scripting-Slaves nun ihre Ohren spitzen und genau mitlesen. Hier steht ganz, ganz, ganz viel wichtiges, wie man sichere Web-Scripts entwickelt (gilt nicht nur für PHP – die grundlegenden Regeln gelten für alle Scriptingsprachen):

  • register_globals = off. Jeder ernstzunehmende PHP-Programmierer, der persönliche Daten von Benutzern in seiner DB liegen hat, muss den entsprechenden Abschnitt im PHP-Manual gelesen haben. Wenn nicht: An die Wand mit ihm.
  • POST und nichts anderes. Die Formulardaten müssen in den $_POST-Variablen daherkommen. Ist das $_POST-Array leer, bricht das Script mit die(); ab. $_REQUEST und $_GET werden nicht beachtet (auf Partyguide übrigens schon …) Dies verhindert, dass Spassvögel wie Kollege fixnetdata (s. unten), die mit wget und GET-Variablen Amok laufen (Script-Kiddie halt), Schaden anrichten können.
  • <input type=“hidden“> Die Variable process des Submit-Buttons muss auch im $_POST-Array vorkommen, sonst ist etwas faul. Es wäre dann zu vermuten, dass die Abfrage nicht von einem Browser aus gesendet wurde.
  • Don’t trust GPC: Alles was von Clients kommt, betrachtet man per se als nicht vertrauenswürdig. Plausiblitätstest sind nötig (besonders beim dritten Partyguide-Hack mangelte es eben gerade an diesem Plausiblitätstest. Motto: „Der Client will das Feld passwort durchsuchen – dann durchsuchen wir es halt und geben es zurück. Er wird schon wissen, wieso er das will“.). Ich speichere also nicht einfach $_POST['value'] direkt in die Datenbank, sondern a) wandle es mit intval(); in einen Integer-Wert um und prüfe dann, ob der Wert 0 oder 1 entspricht. Falls nicht, stirbt das Script mit die();
  • Loggen, loggen, loggen: Man nimmt bei einer solchen Umfrage eben halt auch nicht einfach nur das Abstimmungsresultat entgegen. Ich loggte – sofern alle vorangegangen Tests bestanden wurden – folgende Informationen:
    • Datum & Uhrzeit: Sehr wichtig, vgl. Abschnitt Falschwähler in den Resultaten
    • IP-Adresse: Wer sendet die Anfrage? (beachte hierbei auch $_SERVER['X-FORWARDED-FOR'], das von einigen Proxy-Server mitgesendet wird und die tatsächliche IP-Adresse des Clients enthält. Sowohl bei proxy.unibe.ch wie auch proxy.hispeed.ch wird dieser Wert mitgesendet – von anonymen surfen als keine Spur, wenn auch kaum jemand dieses Feld mitloggt).
    • User Agent: Mit welchem Browser wird abgestimmt?

Der Witzbold von fixnetdata

Keine Ahnung, wer du bist, aber du hast noch viel zu lernen:

  • Zuerst stimmst du manuell 28 Mal ab.
  • Danach zeigst du dein wahres Können, indem du wget bemühst und doch tatsächlich meinst, dass ich GET-Variablen akzeptiere werde.

Gerade zweitere Abstimmungsfälschung fand ich sehr amüsant und machte mich mit der Vorgehensweise anhand der access.log kundig:

ibook:~/Desktop mario$ cat access_log.2006-07-12 | grep fixnet | grep HEAD | wc -l
    9562

9562 Aufrufe gab es also insgesamt von Herr … nennen wir ihn … fixnetdata (oder war es eine sie? dann sollten wir uns einmal kennen lernen … *grins*).

Hier ein Beispiel:

117-183.63-81.stat.fixnetdata.ch - - [12/Jul/2006:16:10:31 +0200] "HEAD /scripts/vote.php?value=0 HTTP/1.1" 200 - "-" "curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7i zlib/1.2.3"
117-183.63-81.stat.fixnetdata.ch - - [12/Jul/2006:16:10:31 +0200] "HEAD / HTTP/1.1" 200 - "-" "curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7i zlib/1.2.3"

Erkenntnis am Rande: Ist es nicht überaus Schade, dass solche Personen auch Mac-User sind?

Und wann startete und endete die Attacke eigentlich?

cat access_log.2006-07-12 | grep fixnet | grep HEAD | cut -d " " -f 4
[12/Jul/2006:15:51:55
...
[12/Jul/2006:16:10:37

Wenn das sein Arbeitgeber wüsste …

So, und jetzt nähme mich Wunder, was du dir dabei gedacht hast. Natürlich darfst du anonym antworten, das passt zu deinem Charakter.

Tags:
Labels: Allgemein

Kommentar erfassen