Traversal-Lücke?
bearbeitet von Regina Schlauklug> Hallo Regina,
>
> > ~~~php
> > 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
> <?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.
Tatsächlich.
Wäre diesem Angriffsvector denn dann durch
~~~php
$forbidden=array('//', '../', '/..', '/.ht');
~~~
zu begegnen?