Uploadsicherheit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Uploadsicherheit

    Ich habe mir ein Upload-Script gebastelt und es darf jede beliebige Datei hochgeladen werden, die mit (??:[^_\W]\w{0,20}[^_\W])|(?:[a-z0-9]))\.[a-z0-9]{1,6} matcht. Die hochgeladenen Dateien bekommen automatisch den CHMOD 0444 und mit "ForceType application/octet-stream" in einer .htaccess-Datei erzwinge ich den automatischen download der Datei.

    Gibt es da noch Sicherheitslücken? (Kann gut sein, dass es noch tausende gibt, ich habe keine Ahnung) Wenn ja wäre ich froh für jede Lösung der Sicherheitslücke!
    Ich möchte möglichst alle Dateitypen hochladen können.

    MfG

    JMC

  • #2
    Ich denke so ganz ohne Code wird's relativ schwer, das zu beurteilen. Oder zumindest nur sehr oberflächlich.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      Das Problem besteht genau dann noch, wenn ein anderes Script eine Sicherheitslücke hat und der Angreifer damit andere Dateien includen kann. Dann kann er eine .php Datei die er vorher hochgeladen hat, einfach einbinden.
      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
      var_dump(), print_r(), debug_backtrace und echo.
      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

      Kommentar


      • #4
        Ich habe einen Ordner "uploads". So sieht das PHP-Script ca. aus:

        PHP-Code:
        <?
        error_reporting(E_ALL);

        if(!isset($_FILES['userfile']['error'])){
         message(1);
         exit;
        }elseif($_FILES['userfile']['error']){
         $err = $_FILES['userfile']['error'];
         if($err == 1 || $err == 2){
          message(2);
         }elseif($err == 3){
           message(3);
         }else{
          message(1);
         }
         exit;
        }elseif($_FILES['userfile']['size']>$cf['upload']['max_filesize']){
         message(2);
         exit;
        }
        if(preg_match("/^(?:(?:[^_\W]\w{0,20}[^_\W])|(?:[a-z0-9]))\.[a-z0-9]{1,6}$/i", $_FILES['userfile']['name'] || 
        file_exists("uploads/".$_FILES['userfile']['name'])){
         exit;
        }
        move_uploaded_file($this->tmp_name, "uploads/".$this->filename);


        ?>
        im Ordner uploads hat es dann eine .htaccess-Datei mit dem Inhalt: "ForceType application/octet-stream"

        Wie meinst du das genau? @Shurakei

        Kommentar


        • #5
          Original geschrieben von jmc
          Wie meinst du das genau? @Shurakei
          Na wie schon ... wenn ggf. andere Scripte existieren, die ein include der hochgeladenen Dateien über's Dateisystem ermöglichen, dann ist deine .htaccess herzlich egal, weil gar kein HTTP im Spiel.

          Dass das Problem allerdings ein ganz und gar generelles ist, sollte eh klar sein.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Wie meinst du das genau? @Shurakei
            Ich denke er meint, dass dein Schutz nur dann wirkt, wenn der User die Datei donwloaden will (also via HTTP auf die Ressource zugreifen will). Wenn jetzt ein anderes deiner Scripts einen include() benutzt, könnte ein böswilliger Zeitgenosse, wenn du einfach alles includieren lässt, was übergeben wird, dies einfach ausnutzen und als Parameter zum include() einfach die eben hochgeladene Datei angeben. Da dann der Zugriff via Dateisystem stattfindet wird ein ForceType nix ausrichten können.
            Aber wie gesagt lässt sich dies nur ausnutzen wenn du in einem anderen Script einen nachlässig programmierten include machst.

            Gruss

            tobi
            EDIT:

            ggf könnte es etwas bringen in der htaccess den lokalen Horst (sprich 127.0.0.1) auf denied access zu setzen. Dann sollte auf diesem Verzeichnis kein include() mehr möglich sein

            Zuletzt geändert von jahlives; 22.01.2007, 11:18.
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              @jahlives: Da bei einem include kein HTTP-Request gestartet wird, wird auch keine .htaccess ausgelesen.
              Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
              var_dump(), print_r(), debug_backtrace und echo.
              Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
              Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
              Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

              Kommentar


              • #8
                Aha, k. Das mache ich eh nicht. Aus diesem Ordner kann und wird nichts includiert werden, also müsste es in dem Fall sicher sein.

                @ Shurakai: Wenn man in einem Ordner eine .htaccess-Datei mit Order, Deny Deny from all hinterlegt und dann eine Datei aus diesem Ordner zu includieren versucht wird nur "Access denied..." includiert, also muss die .htaccess-Datei trotzdem irgendwie ausgelesen werden.

                Kommentar


                • #9
                  Original geschrieben von jmc
                  Wenn man in einem Ordner eine .htaccess-Datei mit Order, Deny Deny from all hinterlegt und dann eine Datei aus diesem Ordner zu includieren versucht wird nur "Access denied..." includiert, also muss die .htaccess-Datei trotzdem irgendwie ausgelesen werden.
                  Bei Zugriff über HTTP ja - über's Dateisystem ganz sicher nicht.

                  (Haben wir hier schon wieder jemanden, dem die Unterschiede der beiden Vorgehensweisen nicht klar sind ...?)
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar

                  Lädt...
                  X