Sicherheit/Directory Traversal

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Unter Directory Traversal oder auch Path Traversal versteht man eine Sicherheitslücke, bei der durch fehlende Validierung von Benutzereingaben auf beliebige Dateien und Verzeichnisse zugegriffen werden kann, die dafür eigentlich nicht vorgesehen waren. Diese kann so ausgenutzt werden, dass sensible Daten wie Passwörter preisgegeben werden.

Beispiel[Bearbeiten]

Normalerweise sollte von außen nicht auf Dateien eines Webservers außerhalb des Web-Verzeichnisses oder dessen Unterverzeichnisse zugegriffen werden können. Bei einem Directory-Traversal-Angriff versucht ein Angreifer nun mittels manipulierter Pfadangaben auf Dateien außerhalb dieser Verzeichnisse zuzugreifen.[1]

Beispiel
<?php
$template = 'red.php';
if (isset($_COOKIE['TEMPLATE']))
   $template = $_COOKIE['TEMPLATE'];
include ("/home/users/phpguru/templates/" . $template);
?>

Wenn folgender HTTP-Request gesendet würde …

Beispiel
GET /vulnerable.php HTTP/1.0
Cookie: TEMPLATE=../../../../../../../../../etc/passwd

… würde damit folgendes Ergebnis erzielt:

Beispiel
HTTP/1.0 200 OK
Content-Type: text/html
Server: Apache

root:fi3sED95ibqR6:0:1:System Operator:/:/bin/ksh 
daemon:*:1:1::/tmp: 
phpguru:f8fk3j1OIf31.:182:100:Developer:/home/users/phpguru/:/bin/csh

Empfohlene Methoden[Bearbeiten]

Um Directory Traversal Angriffe zu verhindern, sollten Sie …

  • URI Requests so verarbeiten, dass sie nicht direkt in Datei-Requests resultieren
Beispiel: Mit Listen arbeiten
<?php
// inkludierbare Dateien
$includes = array(
  'login' => 'template-login.html',
  'mail' => 'template-mail.html'
);

// gültige Datei angefordert?
if (array_key_exists('file', $_GET)
  && array_key_exists($_GET['file'], $includes)
) {
  include('path/to/files/'.$includes[$_GET['file']]);
}
Die zum Inkludieren möglichen Dateien werden in einem assoziativen Array definiert. Die include-Anweisung ergeht nur dann, wenn eine passende Ressource vom Server angefordert wurde, also wenn der URL-Parameter file existiert, und wenn er einen Wert enthält, zu dem das Array $includes einen gleichlautenden Schlüssel hat.
  • Wenn ein URI Request auf eine Datei oder ein Verzeichnis erfolgen soll, muss der genaue Pfad angegebene werden und alle Zeichen normalisiert werden. (z.B., %20 in Leerzeichen umgewandelt werden.).
  • It is assumed that a 'Document Root' fully qualified, normalized, path is known, and this string has a length N. Assume that no files outside this directory can be served.
  • Ensure that the first N characters of the fully qualified path to the requested file is exactly the same as the 'Document Root'.
    • If so, allow the file to be returned.
    • If not, return an error, since the request is clearly out of bounds from what the web-server should be allowed to serve.
Beachten Sie: Das Verwenden einer hartkodierten Dateiendung als Suffix-Ergänzung des Pfads ist wirkungslos:
Beispiel
<?php
include($_GET['file'] . '.html');
Durch die Verwendung des Nullzeichens (NULL, signalisiert das Ende des strings) kann alles nach dem $_GET umgangen werden, indem beispielsweise geheim.php\0 gesendet wird – alles nach dem Nullzeichen (dargestellt durch \0) wird ignoriert.

Quellen[Bearbeiten]

  1. SELFHTML-Forum: Traversal Lücke vom 05.04.2016

Weblinks[Bearbeiten]