Directory-Traversal-Lücke - ist mein kleines Script sicher?

  • Abend,
    der kleine Quälgeist ist wieder da ...

    Wie ihr im Titel lesen könnt, bin ich mir nicht so sicher, ob mein Script sicher vor "Directory-Traversal" ist oder nicht.
    Aus diesem Grund poste ich hier mal den kleinen Code :D :

    PHP
    <?php
    $id = $_GET['id'];
    if(file_exists($id.".php"))
    {
    	include($id.".php");
    }
    ?>

    Ich hoffe ihr wisst was ich meine und freue mich auf eure Antworten!


    Gruß,
    Felix

  • Hi,

    nein, das ist relativ unsicher. Eine überprüfung mit file_exists bringt nicht viel, überlege mal, was bei

    http://www.deindomain.de/index.php?id=index

    passsiert? Und das wäre noch ein harmloser fall.


    Gruß
    bandit

  • @bandit600 das ist bei großen scripten viel viel zu aufwändig!

    das mit dem file_exist ist an sich schon garnicht so übel, aber so kann man immer noch eventuell hochgeladene bilder die nicht ganz so toll abgesichert sind relativ leicht mit php code versehene und so schadcode einschleusen..


    include('includes/_inc.'.$id.'.php');

    so kann man weder urls noch datein aus anderen verzeiuchnissen includen.

    so können wirklich bloß datein aus einem verzeichniss welches nur files von dir / kein user uploads enthält ausgeführt werden.

  • also, danke für eure schnellen Antworten,
    habe es umgeschrieben und habe die Frage, ob die sicher ist:

    PHP
    <?php
    $id = $_GET['id'];
    if(file_exists($_SERVER['DOCUMENT_ROOT']."/".$id.".php"))
    {
    	include($id.".php");
    	echo "\n";
    }
    ?>

    MFG
    Felix

  • felixstoessel hast eigentlich meinen post gelesen?

    du must dafür sorgen das man weder durch vorn noch durch hinten anhängen falsche dinge öffnen kann

    das währe doof:

    Code
    include($id);
    http://www.deindomain.de/index.php?id=http://www.google.de
    http://www.deindomain.de/index.php?id=/etc/passwd
    
    
    include('includes'.$id.'.php');
    http://www.deindomain.de/index.php?id=../index

    das währe sicher:

    Code
    include('includes/_inc.'.$id.'.php');

    dort kannst du meines wissen nach (kenne keinen bug) nichts mehr includen was nicht includet werden dürfte.