XaraX: Nicht so voreilig!

Beitrag lesen

Hallo,

vorab: Gegen den beschriebenen Angriff wäre antoines Script übrigens immun.

2.) Ich starte einen HTTP-GET-Request mit den drei heufigsten UploadVer-
    zeichnisorten => ?show=/tmp ?show=/tmp/php ?show=../tmp
    PHP liefert, per Fehlermeldung schon, das richtige Verzeichnis.

Warum sollte PHP durch die übliche Fehlermeldung "No such file _or_ directory" einen Hinweis auf das verwendete Uploadverzeichnis geben? Dir bleibt also nichts weiter übrig, als in den unter 3.) beschriebenen BruteForce-Ansatz auch das Verzeichnis einzubeziehen. Das vermindert die Chancen, die Datei tatsächlich zu finden, noch weiter.

Leider sind die Admins nicht sehr beflissen PHP zu konfigurieren. Die Wahrscheinlichkeit das UploadVerzeichnis mit nur obigen Angaben zu finden ist, ist groß genug. Viel wichtiger finde ich die Tatsache, daß es die Entwickler versäumten selbst bei aktiviertem safe_mode includes aus dem UplodVerzeichnis abzustellen. (Mit anderen Worten: safe_mode_include_dir greift schlichtweg nicht!)

3.) Habe ich das Uploadverzeichnis so ermittelt kann ich mich mit parallelen
    Requests heranmachen per brut force den Namen zu knacken. Dir Wahrschein-
    lichkeit, daß mir das gelingt ist sehr gering - geht aber bei durch-
    schnittlich 2000 Request pro Minute, die möglich sind, nicht gegen NULL.

Ich weiß zwar gerade nicht aus dem Kopf, ob es eine feste Vorschrift gibt, nach der PHP den Namen der temporären Datei konstruiert (abgesehen davon, daß er eindeutig sein muß), aber bei mir produziert PHP Namen der Form phpXXXX, wobei XXXX aus [0-9a-zA-Z] ist. Selbst wenn der Präfix "php" als bekannt angesehen werden könnte und diesem -- wie bei mir -- lediglich 4 Zeichen folgen, ergibt sich für das BruteForce ein Aufwand, der sich ziemlich deutlich in den Serverlogs niederschlagen dürfte:

62 mögliche Zeichen für jede der 4 Stellen macht etwas mehr als 14.7 Mio. Kombinationen. Bei angenommenen 2000 Anfragen pro Minute kommt man auf eine Laufzeit des BruteForcers von reichlichen 5 Tagen. Das sollte doch reichen, um einen Serverdauerbeschuß festzustellen. Auch wenn die durchschnittliche Laufzeit bis zum Finden des Namens kürzer ist... Dazu müßtest du aber tatsächlich schon im richtigen Verzeichnis suchen (siehe Anmerkung zu Punkt 2).

Präfix "php" ist gegeben "rfc1867.c". Es sollten sogar "XXXXXX" sein <stdlib.h>. Aber selbst das läßt sich mit parallelen Requests aushebeln. Weitere Ausführungen mache ich dazu nicht!

Verlangsame ich den Request zu erstens nach erfolgtem erstem Scriptup-load bis auf max_input_time, ist die Wahrscheinlichkeit sehr groß Code ausführen zu können.

Vielleicht liegt es an der fortgeschrittenen Stunde. Aber diesen Satz hab ich leider nicht verstanden... Der war etwas zu konfus. Kannst du bitte nochmal erklären, was du meinst?

Der Unter "1.)" beschriebene Upload läßt sich verzögern bis zu einer Zeit max_input_time. (Mal abgesehen davon, daß dieser Wert standardmäßig auf "-1" gesetzt ist; also die Prüfung abgeschaltet ist!)
Diese Sicherheitslücke wurde durch die sogenannten "Linux-Würmer" auf PHP-Basis ausgenutzt. Nur hat man meiner Ansicht nach die falschen Schlüsse daraus gezogen - nämlich, daß es _nur_ schlechte Scripte sind. Ich sage: Es ist darüber hinaus die mangelnde Aufmerksamkeit beim Konfigurieren PHPs.

Gruß aus Berlin!
eddi

--
Wer Rechtschreibfehler findet, darf sie behalten.