Christian Kruse: Traversal-Lücke?

Beitrag lesen

problematische Seite

Hallo Regina,

if ( isset($_GET['file']) && $_GET['file'] ) {
   $_GET['file'] = './' . $_GET['file'];
   $forbidden=array('../', '/..', '/.ht');
   $_GET['file'] = str_replace($forbidden, '', $_GET['file']);

Danach beginnt der Inhalt von $_GET auf jeden Fall mit './' (dem aktuellen Verzeichnis) und ist um alle Zeichenfolgen bereinigt, mit denen auf ein tieferes Verzeichnis und die im Apache gesperrten '.ht-Dateien' zugegriffen werden kann.

Eben nicht.

<?php
$f = '....///......//etc/passwd';

$f = './' . $f;
$forbidden=array('../', '/..', '/.ht');
$f = str_replace($forbidden, '', $f);
echo $f;

Gibt ./../etc/passwd. Durch weiteres einfügen von ///...... kann man auch weiter den Baum herauf. Ist mir aber auch erst nach Svens Posting aufgefallen.

LG,
CK