Geistiger Hohlraum: PHP und phpBB-Wurm

Beitrag lesen

Diese "Würmer" suchen ja nicht Zugang über die sichtbaren Parameter in $_GET, $_POST, $_COOKIE.

Doch, der phpBB-Wurm gelangt über $_GET["highlight"], dessen Inhalt indirekt mit eval() ausgeführt wird, auf das System (soviel zum Thema eval=evil). Sein angeblicher Nachfolger (der mit dem Ersten außer etwas PHP nicht viel zu tun hat) nutzt anscheinend $_GET-Parameter, die von außen Code importieren (wie Du es weiter unten beschreibst).

Die sind meistens nicht gefährdet, da sie i.d.R. im Script mit etwas festgelegtem verglichen werden.

Meistens ist nicht immer, wie an dem phpBB-Beispiel eindrucksvoll demonstriert wurde.

Besonders gefährdet sind diejenigen Scripte, die mit NICHT INITIALISIERTEN VARIABLEN arbeiten, es also auf eine Notice ankommen lassen würden. Wenn nun diese Variable durch einen externen Paramter beschrieben wird (der eigentlich gar nicht vorgesehen war), dann schleppt man sich eben unbekannte Werte oder sogar Code ein.

Das Problem mit nicht-initialisierten Variablen liegt eher im Bereich unerlaubter Zugriff auf geschützte Bereiche oder dem Skript originäre Funktionen als im Einschmuggeln von zusätzlichem Code. Klassisches Beispiel:

if ($passwort="geheim") {
  $login=true;
}
if ($login) {
  usw.
}

Mit seite.php?login=1 liessen sich solche Prüfungen ohne weiteres umgehen, was dann dazu führte, dass die für den Variablenimport verantwortliche PHP-Option standardmäßig ausgeschaltet wurde.

Besonders gefährdet sind da die "Includer", die Scriptteile aufgrund einer externen Filename-Angabe dazuladen.

index.php?site=start

und dann im Script stehen haben:

include "$site.php";

Das oder

Mesitens ist fopen als Wrapper erlaubt,

dies dürfte das Einfallstor für den Virus sein, der hier angesprochen wurde. Das hat aber weniger mit nicht-initalisierten Variablen zu tun als mit der Frage, warum der Inhalt von $site nicht vor Benutzung geprüft wird. Dabei gilt die Regel, auf exakt das zu prüfen, was drinstehen darf, nicht umgekehrt zu prüfen, ob etwas nicht drinsteht. Mit einer Prüfung auf eine unerlaubte eine URL (http://...) kann man immer noch Systemdateien ausgeben lassen (index.php?site=/etc/passwd). Wird die Datei durch fopen gelesen, könnte man sogar den Code der PHP-Skripte anzeigen lassen.