Avatar billede gulvlugt Nybegynder
18. juni 2008 - 16:06 Der er 11 kommentarer

Den må ikke gå ud af hovedmappen

Hej.

Jeg har downloadet det her system på nettet. Hvordan kan jeg lave sådan at man ikke kan gå ud af "hovedmappen". Lad os kalde den /www/test/

Koden som den er nu kan man køre: files.php?folder=/test/test/../../../
og så kommer man ud af sin "hovedmappe", og kan nu rette i filer der ikke er tilladt.

<?php
session_start();

    if(isset($_GET['folder'])){
        $folder = "/www/test/" . $_GET['folder'] . "/";
        // $folder2 = $_GET['folder'] . "/";
    }else{
        $folder = "/www/test/";
    }

    echo "<html><head><title></title><head><body>";
    echo "<form method='post' name='delForm'><input type='hidden' name='delFile'><input type='hidden' name='show'></form>";
    echo "<script language='javascript'>
      function confirmDel(filename){
          if(confirm('Do you want to delete '+filename+'?')){
            document.forms['delForm'].delFile.value= filename;
            document.forms['delForm'].submit();
        }
      }
      function showFile(filename){
              file = encodeURI(filename);
            window.open('show.php?show='+file);
      }
      </script>";

    if(isset($_POST['UPLOAD_URL'])){
        $uploaddir = $_POST['UPLOAD_URL'];
        $uploadfile = $uploaddir . $_FILES['userfile']['name'];

        if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
            echo  "<script language='javascript'>alert(\"File is valid, and was successfully uploaded.\")</script>";
        } else {
            print "<script language='javascript'>alert(\"Possible file upload attack!  File was not uploaded.\")</script>";
        }
    }
    if(isset($_POST['delFile'])){
        $del = $_POST['delFile'];
        if(is_dir($folder.$del)){
            if(!rmdir($folder.$del)){
                echo "<script language='javascript'>alert(\"Could not delete $del. \\n Make sure folder is empty.\");</script>";
            }
        }else{
            if(!unlink($folder.$del)){
                echo "<script language='javascript'>alert(\"Could not delete $del\");</script>";
            }
        }
    }
    if(isset($_POST['dir'])){
        mkdir($folder.$_POST['dir']);

    }
    if(isset($_POST['fileName'])){
        $newFile = $_POST['fileName'];
        $fh = fopen($folder.$newFile, "w");
        if(fwrite($fh, "")===false){
            echo "<script language='javascript'>   
            alert('$newFile could not be created');
            </script>";
        }
        fclose($fh);
    }

    echo "<hr>";
    if($folder != "../"){
        $parent = substr($folder2, 0, (strrpos(substr($folder2, 0, (strlen($folder2)-1)), "/")+1));

        echo "<button onclick='location.replace(\"files.php?folder=$parent\")'>Parent folder</button><br><hr>";
    }

    $list = make_file_tree($folder);
    $dirlist = $list['dirs'];
    $filelist = $list['files'];
    echo "Directories:<br>";
    echo "<table width = '400'>";
    for($i=0;$i<count($dirlist); $i++){
        echo "<tr><td><a href='files.php?folder=$folder2$dirlist[$i]'>$dirlist[$i]</a></td>";
        echo "<td width='25'><button onclick='confirmDel(\"".$dirlist[$i]."\")'>Delete</button></td></tr>";
    }
    echo "</table><hr>";
        echo "<form name='newDir' method='POST'>Create new directory:<input type='text' name='dir'><input type='submit' value='Create'></form><hr>";

    while ($typelist = current($filelist)) {

        $key = key($filelist);
        echo "<b>Files of type: $key</b><br>";
        echo "<table width = '400'>";
        for($j=0; $j<count($typelist);$j++){

if($typelist[$j] == "index.php") {
}else{

            echo "<tr><td width='90%'>$typelist[$j]</td>";
            if($key == "php"|| $key == "html" || $key == "css" || $key == "htm" || $key == "txt"){
                echo "<td width='25'><button onclick='showFile(\"".$folder.$typelist[$j]."\")'>Edit</button></td>";
            }

            echo "<td width='25'><button onclick='window.open(\"".$folder.$typelist[$j]."\")'>Show</button></td>";
            echo "<td width='25'><button onclick='confirmDel(\"".$typelist[$j]."\")'>Delete</button></td></tr>";
        }
}
        echo "</table><hr>";
        next($filelist);
    }
    echo "<form name='newFile' method='POST'>Create new file:<input type='text' name='fileName'><input type='submit' value='Create'></form><hr>";
    echo "<form enctype=\"multipart/form-data\" method=\"post\">
<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"500000\" />
<input type=\"hidden\" name=\"UPLOAD_URL\" value=\"".$folder."\" />
Upload file: <input name=\"userfile\" type=\"file\" />
<input type=\"submit\" value=\"Upload\" />
</form>";


    echo "</body></html>";

/*testestetstets*/
function make_file_tree($path){ //where $path is your source dir.
$handle=opendir($path);
while($a=readdir($handle)){
    if(!preg_match('/^\./',$a)){
        $full_path="$path$a";
        if(is_dir($full_path)){
            $dirs[]="$a";

        }else if(is_file($full_path) && $a != "temp.txt"){
            $ext = substr($a, (strrpos($a, ".")+1));
            $files[$ext][]="$a";
        }

    }
}
closedir($handle);
$list['dirs'] = $dirs;
$list['files'] = $files;
return $list;
}
?>
Avatar billede jakobdo Ekspert
18. juni 2008 - 16:12 #1
Du kan gøre det på flere måder.
Tjek at $_GET['folder'] ikke indeholder / og/eller ..
Avatar billede jakobdo Ekspert
18. juni 2008 - 16:12 #2
Og hvis man må gå længere ud i mapperne, så er det nok blot .. det ikke må indgå.
Avatar billede gulvlugt Nybegynder
18. juni 2008 - 16:14 #3
Hvis den ikke indeholder "/" så vil den ikke virke når man går videre. Så vil den komme til at være ?folder=testtest
Avatar billede aners Nybegynder
18. juni 2008 - 16:33 #4
Hvad er så problemet i at smide en dot foran? ./resource

De der systemer er der stort set altid huller i...
Avatar billede gulvlugt Nybegynder
18. juni 2008 - 16:36 #5
Det ændre ikke noget. Jeg kan stadig komme ud i mapper jeg ikke må.
Avatar billede showsource Seniormester
18. juni 2008 - 16:42 #6
Sæt en openbase_dir med .htaccess
Eller

if(isset($_GET['folder'])){
$_GET['folder'] = str_replace("../", "", $_GET['folder']);
//.............
Avatar billede olebole Juniormester
18. juni 2008 - 16:45 #7
<ole>

Smid scriptet i havet og find et af én, der kan kode. Det kan gerningsmanden bag den viste kode ikke ... og PHP-koden er kun ét problem!  =)

/mvh
</bole>
Avatar billede gulvlugt Nybegynder
18. juni 2008 - 16:48 #8
Ole -> Hehe. Jamen kender du et så? Et der funker, er simpelt, uden login.
Avatar billede jakobdo Ekspert
18. juni 2008 - 17:30 #9
En måde at kode noget sikkerhed i, kunne f.eks være:

løb dir igennem og giv alle et ID 0 - ??
Og kald så edit af fil med: side.php?edit=1
Eller side.php?folder=2

På den måde styrer du selv hvilken fil der skal redigeres eller folder der skal åbnes.
Avatar billede gulvlugt Nybegynder
19. juni 2008 - 20:22 #10
Hehe. Jeg fandt på en anden løsning:

Jeg oprettede en ny tabel i MySQL. Derinde skrev jeg de filer som man må kunne rette. På websiden udskriver jeg bare siderne.
Avatar billede jakobdo Ekspert
19. juni 2008 - 20:34 #11
Det var også en god ide ja!
Det kræver så du opdatere mysql jævnligt.
Har du brug for at man kan gå frem og tilbage i foldere ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester