echo $begrüßung;
in der aktuellen Internet Professional 10/06 findet sich (laut testticker.de) ein Artikel dazu, wie man mit einem online Tool ein PHP-Script automatisch auf Sicherheitslücken überprüfen kann.
Wenn es das selbe Tool ist, an dessen Erwähnung im Heise-Newsticker ich mich erinnere, dann dürfte das ein kostenpflichtiges Tool gewesen sein, wenn meine Erinnerung stimmt.
Auf sämtliche Sicherheitslücken kann man ein Script, ohne es zu kennen nicht prüfen. Manchmal reicht es, die üblichen Verdächtigen zu probieren, manchmal braucht man den Quelltext, um die Lücke gezielt ausnutzen zu können.
Übliche Verdächtige sind nicht initalisierte Variablen, auf die lesend zugegriffen wird und dazu ein eingeschaltetes register_globals.
Beispiel: Ein Anmeldevorgang
if (stimmt($username, $password))
$angemeldet = true;
Stimmt $username und $password nicht, bleibt $angemeldet uninitialisiert. Bei einem
if ($angemeldet)
irgendwas();
liefert es null, womit die Bedingung nicht erfüllt ist. Das Script sieht also so aus, als ob es zuverlässig arbeitet. Aber denkste. Der Angreifer muss nun den Variablennamen $angemeldet kennen und übergibt ihn einfach als GET-Parameter
http://example.com/script.php?angemeldet=1
Das register_globals macht daraus ein $angemeldet = '1'; und man ist angemeldet, ohne irgendeinen Benutzernamen oder Passwort zu kennen.
Voraussetzung für einen erfolgreichen Angriff dieser Art ist die Kenntnis der verwendeten Variablennamen. Verhindern kann man ihn, indem man konsequent Variablen mit definierten Werten initialisiert. Das muss natürlich so erfolgen, dass sämtliche Entscheidungswege (if, switch, while) berücksichtigt werden. register_globals auszuschalten, ist ein Bekämpfen der Symptome, doch deren Ursache bleibt bestehen.
Dein gesuchter Online-Service kann solche Fehler auch nur dann finden, wenn er zufällig einen passenden Variablennamen trifft.
Der nächste übliche Verdächtige ist Injektion von HTML- und clientseitigem Script-Code
Man gibt einfach ungeprüft und unbehandelt die Eingabe des Benutzers aus.
echo $_GET['foo'];
Steht nun HTML-/Javescript-/Sonstwas-Code in foo, wird dieser in die Ausgabe eingebettet. Solche Lücken schließt man, indem man Daten von außerhalb zum einen auf legalen Inhalt prüft, zum anderen Ausgaben speziell für das Ausgabemedium behandelt. Im Falle einer Ausgabe als HTML bietet sich htmlspecialchars() an. Diese Art Fehler kann das Online-Tool relativ leicht finden.
Eine weitere Injektionsmöglichkeit ist bei SQL gegeben. Für jedes Datenbank-System gelten eigene Regeln, wie bestimmte Sonderzeichen zu notieren sind, damit nicht ihre besondere Bedeutung zum tragen kommt, wenn diese Zeichen in den Nutzdaten vorkommen. Magic Quotes ist ein PHP-Feature, das Abhilfe gegen SQL-Injection bringen soll, doch da es auf sämtliche Eingaben wirkt und nicht nur auf die, die auch in der Datenbank landen, ist sein Handeln manchmal ungewünscht. Und da es auch noch weniger Sonderzeichen berücksichtigt, als beispielsweise MySQL kennt, arbeitet es auch noch unzureichend.
Für MySQL behandelt man Benutzereingaben vor dem Einfügen in das SQL-Statement mit mysql_real_escape_string() oder, wenn man PHPs mysqli-Extension oder PDO einsetzt, mit den dort vorgesehen Mitteln.
SQL-Injection zu finden stelle ich mir für ein automatisches Tool recht schwer vor. Denn man braucht Intelligenz, um Herauszufinden, ob man mit dem Ergebnis der SQL-Injection das Script zu seinen Gunsten beeinflusst hat.
Weitere Fehler, die das Online-Tool finden kann, wären bekannte Lücken in älteren PHP-Versionen. Dagegen hilft einfach up-to-date zu bleiben.
Fazit: Man kann solche Hilfen einsetzen, um einige Fehler zu finden, aber man sollte nicht dem Trugschluss unterliegen, dass das Script sicher sei, nur weil irgendjemand/irgendwas keinen Fehler gefunden hat.
Es gibt unter Garantie noch mehr Möglichkeiten, Script-Lücken auszunutzen, als mir gerade eingefallen sind ...
echo "$verabschiedung $name";