Dateianhänge in Formularen absichern

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Dateianhänge in Formularen absichern

Beitrag von McHubi »

Hallo zusammen,

das Nutzereingaben in Formularen immer misstraut werden sollte, ist klar. Die bei Texteingaben, Checkboxen usw. ja noch rel. einfache Prüfung ist bei Dateianhängen dann schon was komplizierter.

Ich brauche da mal eure Ideen. "Anstoß" ist dabei dieses - nicht ganz neue aber gerade wieder auftauchende - Szenario mit Evil-Jpegs: http://www.golem.de/news/evil-jpegs-fot ... 13625.html Das Ganze würde ich hier gerne mal ganz allgemein angehen ohne direkt mit diesem "Detailfall" loszulegen.

Es gibt also zwei Szenarien:
a) Datei wird nur gemailt.
b) Datei wird zusätzlich auf dem Webserver hinterlegt.

1) Dateiendung
Wenn ich einen Dateianhang in einem Formular erlaube, kann ich vor dem Absenden natürlich auf die Dateiendung prüfen. Das das nicht wirklich was bringt, kennen wir ja alle von den üblichen Spamanhängen.

2) Mime-Type
Statt jetzt auf die .xyz zu prüfen, könnte man per

Code: Alles auswählen

$fileType = $_FILES['attachment']['type'];
den per Browser ermittelten Mime-Type prüfen. Wenn der jetzt übereinstimmt mit dem oder den freigegebenen Typen

Code: Alles auswählen

$upload_granted="false";
if(in_array($filetype,$array_allowed_filetypes)) {
$upload_granted="true";
}
dann ist alles okay. Die Mail kann versendet und die Datei ggf. auf dem Webserver gespeichert werden.

Das Ganze ist jetzt aber auch nicht wirklich zuverlässig. Ich kann eine php-Datei mit dem Inhalt

Code: Alles auswählen

<?php echo 'Murks!'; ?>
als "test.jpg" abspeichern und bekomme als $fileType geliefert: "image/jpeg". Also auch nicht brauchbar.

3) exif-imagetype
Alternativ käme bei Bilddateien das hier in Frage:
$upload_granted="false";
$exif_imagetype=exif_imagetype($tempFile);
if($exif_imagetype)
{
$imginfo_array = getimagesize($tempFile); // returns a false if not a valid image file
if ($imginfo_array !== false) $upload_granted="true";
}
Die als "test.jpg" getarnte php-Datei fliegt auf, da $exif_imagetype leer ist.

2) und 3) in Kombination
Ich kann natürlich auch eine jpg-Datei als php-Datei tarnen. Ein Bild würde also von "schnappschuss.jpg" zu "schnappschuss.php" und würde - beim Direktaufruf per Browser - vom Webserver versucht auszuführen und das Leck ist da. - Korrigiert mich, wenn ich falsch liege - habe das probiert und im FF wird Zeichensalat ausgeworfen statt das Bild anzuzeigen. Was mit der Datei passieren soll, wird also an der Dateiendung/ dem Mime-Type festgemacht. Im IE dagegen wird das Bild angezeigt.

Die erste Prüfung dieser "schnappschuss.php" nach dem Mime-Type gibt als falschen Typ "application/octet-stream" aus. Der exif-imagetype wird mit "2" dagegen richtig erkannt. Der Dateianhang/Upload wäre - wenn nur nach dem exif-imagetype geschaut würde - völlig okay und die Datei würde gemailt und/oder auf dem Webserver gespeichert. Aber da hier ein ".php" als Dateityp vermerkt ist, stellt sich die Frage: wie verfährt der Webserver damit bei einem direkten Aufruf?

Hier müsste man dann also die beiden Prüfergebnisse gegeneinander laufen lassen und da "application/octet-stream" keine Bilddatei ist: Finito, kein Versand, kein Upload.

Man könnte aber auch die Dateiendung korrigieren. Wenn also der exif-imagetype eine "2" auswirft, bekommt die Datei im Mailanhang bzw. für den Upload auf dem Webserver ein ".jpg" verpasst - egal wie die ursprüngliche Endung lautete - was auch bei ".jpeg" usw. passieren würde.

4) Berechtigungen und Dateiname
Was noch zur Sicherheit beitragen dürfte, ist das Verhindern ausführbaren Codes im für die Ablage der Datei bestimmten Verzeichnis auf dem Webserver. Also Verzeichnis- und Dateiberechtigungen sowie Servereinstellungen entsprechend einrichten. Zusätzlich würde ich entweder den Originaldateinamen komplett ersetzen oder durch eine zufällige Zeichenfolge erweitern, was den Direktaufruf von außen erheblich erschweren würde. An den Pfad kommt man ja - zum Beispiel bei Profilbildern in Foren usw. - recht einfach. Und wenn der Dateiname nach dem Upload gleich bliebe, ließe sich die Datei auch aufrufen. Gut, wenn die vermaledeite Bilddatei als Profilbild angezeigt wird, dann lässt sich auch der Dateiname ermitteln und die Datei aufrufen. Meine Hoffnung ist jetzt, dass hier die Art der Ausführung durch die Korrektur von ".php" auf ".jpg" Schlimmeres verhindert. Was aber natürlich nicht für die eingangs erwähnten evil-jpegs mit Code in den exif-Daten usw. gilt. Hier würden dann aber die Berechtigungen das Ausführen von Code verhindern.

Das scheint mir - zumindest was Bilddateien betrifft - schon ganz okay zu sein. Oder reicht es die Berechtigungen zum Ausführen von Code zu beschränken? Zumindest was den Dateiupload betrifft. Eine per Mail weitergeleitete und als ".jpg" getarnte ".exe" müsste durch die Methoden 2 und 3 abgewiesen werden.

Wo ich aber gerade gar nicht weiter komme, ist die Frage: Was ist, wenn pdfs, docxs, pptxs usw. ebenfalls erlaubt sein sollen? Hier wird die Prüfung - für mich - schon sehr viel verworrener.

EDIT: Okay, habe hier dann doch endlich was vielversprechendes gefunden und lese mich mal ein: http://wiki.selfhtml.org/wiki/PHP/Anwen ... ile_Upload

Ich sag trotzdem schon mal Danke für eure Ideen! :D


Markus
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Dateianhänge in Formularen absichern

Beitrag von Faar »

Hi Markus,

bei Bildern gibt es die Möglichkeit, die Du in 3 schon angezeigt hast, nämlich sie durch die PHP-Bildbearbeitung zu jagen, wie z.B.: http://php.net/manual/de/function.exif-imagetype.php
Denn <?php echo 'Murks!'; ?> hat keine Exif-Daten und umwandeln lässt sich sowas auch nicht als Bild.

PDF guckst du hier: http://php.net/manual/de/book.pdf.php
Mit http://php.net/manual/de/function.pdf-o ... cument.php öffnest du das PDF-Dokument.
Geht das nicht, ist es kein PDF.

Aber alle Dateien in dieser Weise auf Echtheit zu überprüfen dürfte kaum möglich sein, weil dazu bräuchtest du alle passenden Filter...
Siehe hier: http://php.net/manual/de/function.finfo-file.php

Die Ablage in einem geschützten Verzeichnis halte ich für brauchbar, wobei du dazu an die Server-Rechte heran musst.

:(

Edith: Tika http://tika.apache.org/
Und da musst Du dann durch :roll: http://tika.apache.org/1.8/examples.html
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Dateianhänge in Formularen absichern

Beitrag von Oldperl »

Servus Markus,

ob dir ein einfacher Dateicheck gegen Viren und Schadcode wirklich hilft möchte ich bezweifeln, da kämpfen viele Programme damit. Hier sollte es dann doch schon ein wirklicher Scan der Datei(en) auf Schadcode sein. Eine Möglichkeit ist der Einsatz von ClamAV,, sofern auf dem Server installiert, und dessen PHP5-Anbindung php-clamav.

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Dateianhänge in Formularen absichern

Beitrag von McHubi »

Hallo zusammen,

vielen Dank für Eure Antworten. Nein, trivial ist das Ganze nicht. Mir gehts im ersten Schritt erst einmal darum, die "Scheunentore" zu schließen. Sprich, mit php-Bordmitteln offensichtliche Lücken, die sich mit wenig Aufwand mal eben ausnutzen lassen, zu stopfen. In der Hinsicht sind die skizzierten Lösungen für Bilder und pdf, die ja in der Regel in Frage kommen, schon ganz gut. 100%ige Sicherheit gibt es dadurch natürlich nicht. Wie das Beispiel der evil jpegs ja zeigt. Aber man ist bei Dateianhängen zumindest nicht mehr grob fahrlässig unterwegs.

VG
Markus
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Antworten