Michael: Verzeichnisrechte Bildupload / Sicherheitsrisiko?

Hallo,

auf meiner Website habe ich einem Verzeichnis die Rechte CHMOD 777 gegeben, damit ich in dieses Verzeichnis über eine PHP Script Bilder eines Bilduploads (akzeptiert nur Bilder und nichts anderes :-) hineinkopieren kann (755 reicht leider nicht aus, da das schreibende PHP Script als "Others" gilt).

Wie ich nun in diesem Forum erfahren habe, scheint dies ein grosses Sicherheitsrisiko zu sein. Andere Nutzer auf dem Server können dadurch beliebig auf das entsprechende Verzeichnis zugreifen (schreibend).

Nun frage ich mich doch, wie ich das Abspeichern von Daten/Bildern dann gestalten soll? In vielen Foren heißt es nämlich dann immer "... setzt das Verzeichnis auf 777 ... :-)"

Wäre es eine sinnvolle Lösung, vom Bildupload Script kurzzeitig die Rechte des Verzeichnisses auf 777 zu setzen -> Bild hineinkopieren -> Verzeichnis zurücksetzen (755)?

Oder hat jemand einen besseren Vorschlag?

Danke im Vorraus

Gruß
Michael

P.S.: Die oben beschriebene Problematik dürfte ja dann auch z.B. einfache PHP Scripte betreffen (Zähler), welche über eine Datei gewisse Informationen auf dem Server abspeichern, da diese Datei dann entsprechend auch auf 777 gesetzt werden müsste und damit angreifbar wäre...

  1. Hi,

    (akzeptiert nur Bilder und nichts anderes :-)

    woran erkennst Du, dass es sich um ein Bild handelt?

    (755 reicht leider nicht aus, da das schreibende PHP Script als "Others" gilt).

    Dann hat das Verzeichnis den falschen Owner. Das ist aber unerheblich, da _jeder_ über den Server erfolgende Zugriff vom selben User ist.

    Wie ich nun in diesem Forum erfahren habe, scheint dies ein grosses Sicherheitsrisiko zu sein. Andere Nutzer auf dem Server können dadurch beliebig auf das entsprechende Verzeichnis zugreifen (schreibend).

    Ja. Auf dem Server. Das setzt voraus, dass jemand auf dem Server eine entsprechende Aktion durchführen kann - dass also (von Dir) eine entsprechende Methode bereitgestellt wird. Zum Beispiel Dein Upload-Script.

    Wäre es eine sinnvolle Lösung, vom Bildupload Script kurzzeitig die Rechte des Verzeichnisses auf 777 zu setzen -> Bild hineinkopieren -> Verzeichnis zurücksetzen (755)?

    Nein. Dazu muss das Script (=der Server) hinreichende Rechte haben, und ergo hat sie auch jedes andere Script auf dem Server. Desweiteren kann das Zurückbiegen der Rechte schiefgehen; z.B. wenn das Script vorher abschmiert.

    Oder hat jemand einen besseren Vorschlag?

    Sorge für Bekanntheit _aller_ schreibenden Schnittstellen. Sichere diese gegen unerlaubte Aktionen ab.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      erst einmal vielen Dank für deine Antwort.

      woran erkennst Du, dass es sich um ein Bild handelt?

      -> Zunächst prüfe ich mit getimagezize den Typ der hocgeladenen Grafik, falls dieser Test bestanden wurde, wird das Bild umbenannt in abc.jpg und umkopiert. Demzufolge wäre selbst ein eingeschleustes PHP Script wirkungslos.

      Sorge für Bekanntheit _aller_ schreibenden Schnittstellen. Sichere diese gegen unerlaubte Aktionen ab.

      Leider kann ich damit mein Problem nicht lösen. Ich muss das Verzeichnis freigeben (CHMODE 777), ansonsten kann ich das Bild aus dem temporären Verzeichnis des Servers nicht hineinkopieren.

      Dadurch hat ja die PHP Funktion move_uploaded_file(...) ihre Funktion verloren, wenn dadurch ein riesen Sicherheitsleck geschaffen wird... :-(

      Vielleicht hat ja noch jemand einen Rat...

      Gruß
      Michael

      1. Hi,

        woran erkennst Du, dass es sich um ein Bild handelt?
        -> Zunächst prüfe ich mit getimagezize

        danke, das wollte ich hören :-)

        Sorge für Bekanntheit _aller_ schreibenden Schnittstellen. Sichere diese gegen unerlaubte Aktionen ab.
        Leider kann ich damit mein Problem nicht lösen. Ich muss das Verzeichnis freigeben (CHMODE 777), ansonsten kann ich das Bild aus dem temporären Verzeichnis des Servers nicht hineinkopieren.

        Ich meinte: Sorge dafür, dass Du über jeden Weg, in dieses Verzeichnis irgendwas zu schreiben, bescheid weißt. Also insbesondere, wer alles (z.B.) FTP-Zugang hat, wer im HTTP-Umfeld (i.d.R. alle) über welche Scripts was schreiben darf usw.

        Dadurch hat ja die PHP Funktion move_uploaded_file(...) ihre Funktion verloren, wenn dadurch ein riesen Sicherheitsleck geschaffen wird... :-(

        Für sich betrachtet ist diese Funktion kein Sicherheitsleck. Es ist dafür zu sorgen, dass kein Missbrauch möglich ist.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          Ich meinte: Sorge dafür, dass Du über jeden Weg, in dieses Verzeichnis irgendwas zu schreiben, bescheid weißt. Also insbesondere, wer alles (z.B.) FTP-Zugang hat, wer im HTTP-Umfeld (i.d.R. alle) über welche Scripts was schreiben darf usw.

          FTP Zugang zu dem Server, wo meine Seiten liegen, haben natürlich eine Menge anderer User, die ebenfalls bei dem Anbieter ihre Seiten hosten. Demzufolge haben diese dann alle Zugriff auf dieses freigegebene Verzeichnis (sofern die URI kennen oder auslesen). Demzufolge kann ich mich also vor diesen anderen Usern nicht schützen, wenn ich ein Verzeichnis zum Schreiben freigebe. Sehe ich das richtig???

          Gruß
          Michael

          1. Hallo,

            habe das Problem lösen können :-) Jetzt kann ich mit move_uploaded_file() auch in Verzeichnisse meines Webprojektes hineinschreiben, die lediglich über die Recht CHMOD 700 verfügen. Bisher musste ich ja stets 707 setzen.

            Mein Fehler lag darin begründet, dass Dateien/Verzeichnisse welche von PHP Scripten angelegt werden und Dateien/Verzeichnisse welche vom mir per FTP angelegt oder hochgeladen werden stets im Kontrast OWNER - OTHERS zueinander stehen. Deswegen konnte ich auch nicht mit einem PHP Script per move_uploaded_file() in ein Verzeichnis schreiben, welches per FTP angelegt worden war.

            Somit musste ich lediglich mit dem PHP Befehl mkdir("abc",0755) zunächst das Verzeichnis anlegen, in welches ich später die Dateien (wieder mit PHP Scripten) hineinkopieren will. Man beachte: Mit FTP kann man später in dieses Verzeichnis nichts mehr hineinkopieren (außer man setzt mit PHP die Rechte auf 777).
            Zu beachten gab es dann nur noch, dass bevor man mkdir("abc",0755) aus der PHP Datei abc.php ausführen könnte, dass entsprechende Verzeichnis, wo abc.php liegt mit 777 freigeben musste (da dieses ja vom FTP Programm angelegt wurde). Nach Ausführung von abc.php sollte man dies dann aber sofort wieder auf 755 zurücksetzen, damit niemand seinen Unfug treibt...

            Nochmal Danke für eure Hilfe...

            Gruß
            Michael

            1. Hallo,

              muss mich revidieren. Das Verzeichnis hat zwar nun den Status 700 bzw. 755, aber da nun der PHP Parser als OWNER deklariert ist hat dies denselben Effekt, wie wenn man per FTP ein Verzeichnis erstellt, welches den Status 777 hat.
              Habe bei dem Hoster zum Glück 2 Domains und konnte etwas rumspielen. So konnte ich mit einem Script des einen Pakets in das Verzeichnis des anderen Pakets hineinschreiben, obwohl CHMOD 700 auf dem Verzeichnis lag... !!!

              Ich glaube diese Thema wird mir noch schlaflose Nächte bereiten...

              Gruß
              Michael

              1. Hi

                Habe bei dem Hoster zum Glück 2 Domains und konnte etwas rumspielen. So konnte ich mit einem Script des einen Pakets in das Verzeichnis des anderen Pakets hineinschreiben, obwohl CHMOD 700 auf dem Verzeichnis lag... !!!

                Ich glaube diese Thema wird mir noch schlaflose Nächte bereiten...

                Schau mal was für ein OS verwendet wird.
                Wenn du ACLs verwenden kannst, dann könntest du damit das Problem lösen.
                http://www.xwolf.de/artikel/acls.shtml

                Ciao,
                 Wolfgang

                1. Hallo,

                  vielen Dank für die neuen Antworten. Nach langem rumprobieren habe ich jetzt eine akzeptable Lösung für mich gefunden. Das einfachste wäre gewesen, die Bilder in eine Datenbank zu kopieren. 99,9% Sicherheit, aber die Nachteile wurden in diesem Forum ja bereits genauestens erörtert.

                  Doch dann fiel mir plötzlich ein, dass mein Anbieter ja mehrere ftp Accounts unterstützt und die entsprechenden PHP Befehle für den ftp Zugriff ebenfalls einsetzbar sind.

                  Demzufolge habe ich nun ein Verzeichnis "bilder" mit meinem ftp-Programm erstellt CHMOD 755. Dadurch ist das Verzeichnis zu 99,9% sicher gegen Serverseitige Zugriffe andere Nutzer. Dann habe ich mir einen ftp Zugang eingerichtet, welcher direkt auf das Verzeichnis "bilder" gerichtet ist. Nun schreibe ich ganz bequem per PHP Script mittels ftp_connect() etc. die hochgeladenen Bilder in das entsprechende Verzeichnis.

                  Ich denke mal, dass ist die sicherste Variante, die bei meinem Provider möglich ist. Was haltet ihr davon? Seht ihr irgendwelche Sicherheitlücken, die mir entgangen sein könnten, gerade weil ja das Passwort in der PHP Datei auf dem Server liegt? ... aber auf diese habe ja eigentlich nur ich Zugriff...

                  Gruß
                  Michael

                  1. Hi Michael,

                    Demzufolge habe ich nun ein Verzeichnis "bilder" mit meinem ftp-Programm erstellt CHMOD 755. Dadurch ist das Verzeichnis zu 99,9% sicher gegen Serverseitige Zugriffe andere Nutzer.

                    wie kann Dein Verzeichnis sicher sein gegen Zugriffe anderer Nutzer, wenn Du _jedem_ Benutzer das Recht erteilst, Deine Dateien zu lesen?

                    gerade weil ja das Passwort in der PHP Datei auf dem Server liegt?

                    Laß den Provider einen temporären Konfigurationsfehler machen und Deine PHP-Datei nur ein einziges Mal uninterpretiert als Klartext an den Browser versenden, ohne daß Du das mitkriegst ... knirsch. Mit einem Passwort, das Du aus einer separaten Datei einliest, fährst Du hier besser.
                    (Das Self-Portal war früher mal auf einem Server eines solchen Providers und hat diesen Effekt live miterlebt ...)

                    Viele Grüße
                          Michael

                    --
                    T'Pol: I apologize if I acted inappropriately.
                    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
              2. Hi Michael,

                Ich glaube diese Thema wird mir noch schlaflose Nächte bereiten...

                würde Dein Provider einen Mechanismus a la "suexec" einsetzen, der dafür sorgt, daß Deine serverseitigen Anwendungen (inklusive PHP) unter _Deiner_ Benutzerkennung ausgeführt werden und nicht unter "nobody", dann hättest Du Dein Problem nicht - und gleichzeitig hättest Du kein Problem damit, ein Verzeichnis sowohl per PHP als auch per FTP zu bearbeiten, weil eben beide Zugriffsverfahren dieselben Berechtigungen verwenden würden.

                Also: Suche Dir einen Provider, der Deinen Ansprüchen gerecht wird.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.