$xNeTworKx: Überprüfung bei Uploadscript ?

Hallo,

Ich würde gern wissen, wie ich überprüfen kann, ob es sich bei einem mit einem Script geuploadeten File wirklich um ein Grafikfile handelt. Ich meine jetzt nicht if ($file =~ /^.+?.gif$.... oder so, sondern ich will wissen, oba der Inhalt wirklich aus Grafik besteht. es könnte ja sein, daß mir sonst jemand vielleicht irgendwie ein arglistiges C Script oder so unterjubeln will, was ich natürlich vermeiden will.
Ich hab da mal was über Content-type überprüfen oder so gelesen. Hat jemand ein paar nützliche Links/Tips ?

danke.

  1. Hallo,

    Ich würde gern wissen, wie ich überprüfen kann, ob es sich bei einem mit einem Script geuploadeten File wirklich um ein Grafikfile handelt. Ich meine jetzt nicht if ($file =~ /^.+?.gif$.... oder so, sondern ich will wissen, oba der Inhalt wirklich aus Grafik besteht. es könnte ja sein, daß mir sonst jemand vielleicht irgendwie ein arglistiges C Script oder so unterjubeln will, was ich natürlich vermeiden will.
    Ich hab da mal was über Content-type überprüfen oder so gelesen. Hat jemand ein paar nützliche Links/Tips ?

    danke.

    Hallo
    Du könntest die Datei nach dem Upload (binary) öffnen und nach Besonderheiten suchen.
    Ein .gif zum bsp. hat als die ersten 3 Zeichen immer "GIF". Wenn dort was anderes steht ist es keine gif-grafik.
    Wenn du mit einem Hex-Editor ander Grafikformate untersuchst wirst du auch für diese schnell Erkennungsmerkmale finden.

    Karl :-)´

    1. Hallo,

      Du könntest die Datei nach dem Upload (binary) öffnen und nach Besonderheiten suchen.
      Ein .gif zum bsp. hat als die ersten 3 Zeichen immer "GIF". Wenn dort was anderes steht ist es keine gif-grafik.
      Wenn du mit einem Hex-Editor ander Grafikformate untersuchst wirst du auch für diese schnell Erkennungsmerkmale finden.

      Achja richtig, eine Grafik muss immer binär sein. dH, wenn ich überprüfe, ob die Grafik binär ist, müsste es eigentlich sicher eine Grafik sein, da ein getarntes Script binär ja nicht funktionieren würde. Hab ich in dieser Annahme recht ?

      1. Hi nochmal,

        Achja richtig, eine Grafik muss immer binär sein. dH, wenn ich überprüfe, ob die Grafik binär ist, müsste es eigentlich sicher eine Grafik sein, da ein getarntes Script binär ja nicht funktionieren würde. Hab ich in dieser Annahme recht ?

        wenn ich so überlege, müsste das Problem doch mit if (-B $file) bzw. if (!-T $file) gelöst sein, oder ?

        1. Hallo,

          wenn ich so überlege, müsste das Problem doch mit if (-B $file) bzw. if (!-T $file) gelöst sein, oder ?

          Du könntest mit dem Modul Image::Size verwenden, um die Größe des Bildes zu bestimmen. Wenn imgsize() undef zurückliefert, dann stimmt da was nicht, also sollte das Script das 'Bild' am besten ablehnen.

          Grüße
            Klaus

          1. Hallo,

            Du könntest mit dem Modul Image::Size verwenden, um die Größe des Bildes zu bestimmen. Wenn imgsize() undef zurückliefert, dann stimmt da was nicht, also sollte das Script das 'Bild' am besten ablehnen.

            ok danke, werd auf jeden Fall beide Sachen ausprobieren, wenn ich so weit bin.

      2. Hallo,

        Du könntest die Datei nach dem Upload (binary) öffnen und nach Besonderheiten suchen.
        Ein .gif zum bsp. hat als die ersten 3 Zeichen immer "GIF". Wenn dort was anderes steht ist es keine gif-grafik.
        Wenn du mit einem Hex-Editor ander Grafikformate untersuchst wirst du auch für diese schnell Erkennungsmerkmale finden.

        Achja richtig, eine Grafik muss immer binär sein. dH, wenn ich überprüfe, ob die Grafik binär ist, müsste es eigentlich sicher eine Grafik sein, da ein getarntes Script binär ja nicht funktionieren würde. Hab ich in dieser Annahme recht ?

        ACHTUNG HOLZWEG!!!!
        auch eine .exe (wie alles böse) ist ein binary!
        mein "(binary)" bezog sich nur darauf, dass man unter win einen file als binary öffnen muss wenn man wirklich jedes zeichen genau auslesen will. unter linux z.b. ist mein "(binary)" makulatur.
        mein vorschlag bezog sich darauf die signatur der datei zu prüfen.
        praktisch jedes fileformat hat eine signatur oder header an der man es erkennen kann. und grafiken eben auch.
        ich hab mal kurz gesucht und siehe da !! unter:
        http://www.lrz-muenchen.de/services/software/grafik/grafikformate/
        werden die signaturen und header aller wichtigen grafikformate genauestens beschrieben. und schon weisst du ob xyz.bmp auch wirklich ein bitmap-image ist.

        karl :-)´

        1. Hallo,

          ACHTUNG HOLZWEG!!!!
          auch eine .exe (wie alles böse) ist ein binary!

          aber eine .exe kommt durch die Dateiendungsüberprüfung nicht durch :).
          Da gabs mal vor einiger Zeit so ein Posting mit einem Link. Wenn man diesen klickte (mit XP und IE) meldete sich XP plötzlich ab :). Der Link war ein .jpg File. Was war das eigentlich für ein "getarntes" File ?

          1. use Mosche;

            ACHTUNG HOLZWEG!!!!
            auch eine .exe (wie alles böse) ist ein binary!

            aber eine .exe kommt durch die Dateiendungsüberprüfung nicht durch :).

            Linux-Executables haben keine Dateiendung .exe.

            use Tschoe qw(Matti);

          2. Hallo,

            aber eine .exe kommt durch die Dateiendungsüberprüfung nicht durch :).

            Dateiendungen kann ich genauso frei wählen, wie den Content-Type. Die eignen sich nicht für eine zuverlässige Prüfung.
            Da fällt mir gerade was ein *hehehe*.
            Unter Unix/Linux gibts doch diese magic-Fileprüfung. Dies Prüfung ist eigentlich die beste, da im magic-file (normalerweise /etc/magic) Regeln abgelegt sind, um von einem Dateiinhalt dessen Typ zu bestimmen.

            Also du kannst mit 'file -i filename' z.B. den MIME-Type der Datei 'filename' überprüfen. (benötigt allerdings noch eine zusätzliche Datei)

            Alternativ gibt es für Perl (no na) ein passendes Modul namens File::MMagic.

            Damit könntets Du eine universelle Prüfung implementieren, die nicht  nur bestimmte Dateien, Grafiken, sondern beliebige Dateitypen erkennt, egal wie kaputt das Client-Programm ist.

            Grüße
              Klaus

            1. Hallo,

              Also du kannst mit 'file -i filename' z.B. den MIME-Type der Datei 'filename' überprüfen. (benötigt allerdings noch eine zusätzliche Datei)

              das versteh ich jetzt nicht ganz, was ist mit zusätzliche datei gemeint?

              Alternativ gibt es für Perl (no na) ein passendes Modul namens File::MMagic.

              Hmmm hab nachgesehen, aber es scheint so, daß es nicht zur standardbibliothek gehört. allerdings habe ich HTTP::headers gefunden.
              http://www.perldoc.com/perl5.6.1/lib/HTTP/Headers.html
              ich glaube, damit könnte ich so eine headerüberprüfung auch bewerkstelligen.

              1. Hallo,

                Also du kannst mit 'file -i filename' z.B. den MIME-Type der Datei 'filename' überprüfen. (benötigt allerdings noch eine zusätzliche Datei)

                das versteh ich jetzt nicht ganz, was ist mit zusätzliche datei gemeint?

                Da gibt es zum einen die /etc/magic, mit der bekommt man quasi Klartext-Bezeichner wie ' ', und dann noch eine Variation davon, mit dem Namen 'magic.mime', die eben den MIME-Typ zurückgibt.
                Das Format dieser Dateien ist eigentlich immer gleich aufgebaut, hier einmal ein 'dokumentatorischer Auszug'[1] aus einem von 'meinen':

                The format is 4-5 columns:

                #    Column #1: byte number to begin checking from, ">" indicates continuation
                #    Column #2: type of data to match
                #    Column #3: contents of data to match
                #    Column #4: MIME type of result
                #    Column #5: MIME encoding of result (optional)

                Alternativ gibt es für Perl (no na) ein passendes Modul namens File::MMagic.

                Hmmm hab nachgesehen, aber es scheint so, daß es nicht zur standardbibliothek gehört.

                Nein, aber ist einfach über http://www.cpan.org zu beziehen.

                allerdings habe ich HTTP::headers gefunden.
                http://www.perldoc.com/perl5.6.1/lib/HTTP/Headers.html
                ich glaube, damit könnte ich so eine headerüberprüfung auch bewerkstelligen.

                Da gibt nur einen kleinen, wenn auch nicht unerheblichen, Haken dabei.  Ich könnte Dir, bösartig wie ich bin, einen HTTP-REquest senden, der vorgibt, Dir eine Grafik zu schicken, also sowohl der Dateiname ist irgendwie grafiktypisch, ebenso wie der Content-Type, sagen wir mal, image/gif ist. Trotzdem ist in der Datei ein ganz böser Virus, und jeder der sich diese Grafik mit dem falschen Browser, äh programmiertechnisches Sicherheitsrisiko, ansehen will, hat sich dann einen Virus eingefangen.
                Nein nein, die sicherste Methode ist es, sich den _Inhalt_ der gesendeten Datei genauer anzusehen.

                Grüße
                  Klaus

                [1] darf man so einen Ausdruck überhaupt verwenden? *g*

                1. Hallo,

                  allerdings habe ich HTTP::headers gefunden.
                  http://www.perldoc.com/perl5.6.1/lib/HTTP/Headers.html
                  ich glaube, damit könnte ich so eine headerüberprüfung auch bewerkstelligen.

                  Da gibt nur einen kleinen, wenn auch nicht unerheblichen, Haken dabei.  Ich könnte Dir, bösartig wie ich bin, einen HTTP-REquest senden, der vorgibt, Dir eine Grafik zu schicken, also sowohl der Dateiname ist irgendwie grafiktypisch, ebenso wie der Content-Type, sagen wir mal, image/gif ist. Trotzdem ist in der Datei ein ganz böser Virus, und jeder der sich diese Grafik mit dem falschen Browser, äh programmiertechnisches Sicherheitsrisiko, ansehen will, hat sich dann einen Virus eingefangen.
                  Nein nein, die sicherste Methode ist es, sich den _Inhalt_ der gesendeten Datei genauer anzusehen.

                  Oh, danke für den Tip. Das wäre ja schon wieder ein extremes Sicherheitsrisiko.

                  [1] darf man so einen Ausdruck überhaupt verwenden? *g*

  2. Hi!

    es könnte ja sein, daß mir sonst jemand vielleicht irgendwie ein arglistiges C Script oder so unterjubeln will, was ich natürlich vermeiden will.

    Arglistig? Na gut, Du hast dann Datenmuell (== keine Grafik, in diesem Fall) in Deinem Verzeichnis, aber was ist diesbezueglich an einem Scipt arglistiger als an einer HTML-Datei, die ja auch keine Grafik ist?

    Wie auch immer, das file-Kommando, welches auf Unixen normalerweise verfuegbar ist, ist Dein Freund.
    http://www.freebsd.org/cgi/man.cgi?query=file&apropos=0&sektion=0&manpath=FreeBSD+4.6-RELEASE&format=html

    So long

    --
    Freiheit wird einem nicht gegeben, man muss sie sich nehmen.

  3. Hi,

    zum Upload hab ich mal ein kleines Tutorial geschrieben, siehe Link. Da ist auch die Möglichkeit beschrieben wie der Content-type ermittelt wird. Allerdings ist das abhängig vom Browser, genauer gesagt, abhängig davon was der Browser an Header Informationen mitsendet beim Upload.

    Im Tutorial ist auch ein CGI eingebaut mit welchem Du diese Headers auslesen kannst.

    So teste das mal mit einem jpg, IE und NN, beide zeigen
    image/pjpeg

    Dann benenne die jpg Datei mal in eine exe um und teste erneut:
    IE zeigt weiterhin:  image/pjpeg
    NN zeigt nun jedoch: application/octet-stream

    Rolf