in PHP, Programming

Float zu Int – ein Sicherheitsproblem

Eine oft übersehene Sicherheitslücke: Ein serverseitiges Skript, meistens natürlich PHP, überprüft, ob zwei Variablen gleich sind. Eine aus der Datenbank und eine, die vom User übermittelt wurde. Oft kommt dies vor, wenn man sich bei Social-Networks nicht selber als Freund hinzufügen oder eine Nachricht schicken kann. Hier ein Trick, mit dem es manchmal doch funktioniert.

Was übersehen wird: Datenbanken, wie MySQL, wandeln Datentypen (z.B. FLOAT), die in einem Feld mit einem anderen Datentyp (z.B INT),  gespeichert werden sollen, wenn möglich um. Das PHP-Skript prüft also:

if ($_GET['id'] == $db_id) {
echo "Du kannst dir nicht dir selber eine Nachricht schicken!";
} else {
...
}

Wir müssen nun nur eine “Kommazahl” übergeben. Sagen wir, meine ID ist 123, ich übergebe aber 123,4. PHP prüft fleißig alles, und da ihm die Typisierung der Variable egal ist, ist 123 nicht das gleiche wie 123,4. Also wird der Wert an die Datenbank übergeben. Das Feld hat aber nur INT-Variablen zu speichern, also wird alles nach dem Kommata abgeschnitten und der Rest gespeichert. Zack, dass war’s.

Was lernt man daraus jetzt als Webprogrammierer? Immer schön auf die Typen achten. Passen die zur Datenbank? Bei PHP z.B. mit is_int().

Stumpfer Artikel? Ja, herausgefunden habe ich das bereits vor Jahren als kleines Scriptkiddie…aber ich hab so lang nix mehr geschrieben, da musste halt was her ;)

Write a Comment

Comment

  1. Kim Korte schrieb:

    > Wer’s lieber unkompliziert haben möchte, schreibt gleich
    > $zahl = (int)$_GET[‘zahl’];

    Jetzt mal ernsthaft… als PHP Entwickler verdient man nicht viel, ihr macht derartiges freiwillig und verwendet in dem Zusammenhang noch Wörter wie ‘unkompliziert’?

    Wie wär’s mit einer Sprache, die einfach ‘Nein’ sagt, wenn man offensichtlich Mist baut?

  2. Ich berichtige dich nur ungern, aber is_int() hilft dir hier nicht viel weiter. Die Funktion überprüft nämlich lediglich den Typ. Und der ist bei GET/POST Parametern generell string soweit ich weiß. Die Funktion is_numeric() überprüft auf eine gültige Zahl.
    Wer’s lieber unkompliziert haben möchte, schreibt gleich $zahl = (int) $_GET[‘zahl’];

    Dieses Verfahren nennt sich Type Casting, kann oft sehr praktisch sein ;>

  3. Also ich kenn ein Beispiel einer mittelgroßen Lokal-Community in der das funktioniert ;)
    Es geht ja auch nicht primär um das Ausnutzen der Lücke, sondern darum, dass Hobby- und Teilzeitprogrammierer nun vorgewarnt sind… ;)

  4. Ok, schön und gut, aber glaubst du wirklich SN’s wie facebook etc. sind so “dumm”? Wird wohl eher bei so kleinen Seiten sein, wie zum Beispiel – ach ich denk mir mal was aus – Flipster!? (^^)

    Chris