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.

Liked this post? Follow this blog to get more. 

Tags:
Labels: Allgemein

Kommentar erfassen