php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Hochgeladene Bilder auf Hijacking überprüfen?


 
ArSeN
05-04-2009, 21:21 
 
Hallöchen!

Ich hab "nur" ne ganz kurze technische Frage. Ich weiß zwar nicht ganz genau wie das funktioniert, und habe zu dem Thema auch nicht wirklich seriöse Infos gefunden, aber Grafik-Dateien (z.B. JPEGs), können ja meines Wissens "bösen Code" (JavaScripte etc..) enthalten.

Da ich wie gesagt nicht weiß wie das genau von statten geht, bin ich mir nicht ganz sicher, ob mein Ansatz soetwas zu unterbinden korrekt ist, oder ob totaler Unsinn, oder was auch immer.

Ich hatte mir vorgestellt, die Grafiken entsprechend mit imagecreatefromxyz() einzulesen und mit imagecreatexyz() wieder abzulegen. Meines Erachtens schreibt die GD-Lib die, ich sag mal, "Grafik-Informationen" dann neu, und wenn bei der ganzen Prozedur ein Fehler auftritt, ist das Bild wohl nicht in Ordnung.

Frage jedoch: Fange ich damit alle möglichkeiten ab, oder bringt das vielleicht gar nichts? Oder gibt es vielleicht sinnvollere Ansätze?

Noch kurz zur Erklärung: Es geht um vom Benutzer hochgeladene Bilder, die ja unter umständen auch aus Versehen derartigen Code enthalten können.

Vielen Dank im Voraus schonmal :)

 
TobiaZ
05-04-2009, 21:25 
 
Hmm, wenn man die Gefahr nicht kennt, ist es schwer Gegenmaßnahmen zu treffen. :dontknow:

 
PHP-Desaster
05-04-2009, 22:15 
 
Im Klartext: Du willst überprüfen, ob die hochgeladene Datei ein Bild ist. Dann nimm getimagesize und gut ist.

 
ArSeN
05-04-2009, 22:18 
 
Original geschrieben von PHP-Desaster
Im Klartext: Du willst überprüfen, ob die hochgeladene Datei ein Bild ist. Dann nimm getimagesize und gut ist. So kann mans kurz sagen, ja :p

Gut, erstmal danke für die Antwort. Jedoch: Könnte sich nicht "böser code" (von dem ich wie gesagt nicht weiß wie der funktioniert, vielleicht weißt du mehr?), nicht im Header oderso verstecken, so dass der von getimagesize ggfs. gar nicht bemerkt wird?

Ich will da einfach auf der sicheren Seite sein darum frag ich nochma - ich hoffe ihr sehts mir nach :D

Grüßli

 
TobiaZ
05-04-2009, 22:26 
 
Also ziehen wir mal Kurz ne Zwischenbilanz:

Du hast eigentlich gar kein PHP-Problem, sondern müsstest erstmal wissen, wovor du angst hast.

Dir hat jemand erzählt, dass JS-Code sich in Bilddateien verstecken kann. Das ist ja erstmal nichts schlimmes. Jetzt nimmst du aber an, dass dieser Code, wenn du das entsprechende Bild in deine Webseite einbindest, auch vom Browser interpretiert und ausgeführt wird.

Soweit richtig?

Dann frag doch erstmal danach um überhaupt mal ne Bestätigung für deine Vermutung zu haben.

Mir fällt es spontan nämlich erstmal schwer zu glauben, dass der Browser irgendwelchen JS-Code in den Bilder ausführen sollte. :dontknow:

*verschieb* nach OT

 
ArSeN
05-04-2009, 22:29 
 
Mehr oder minder, ich meine dies hier:

http://www.gnucitizen.org/blog/backdooring-images/

Ist das einzige was ich zu dem Thema gefunden hab, und ich weiß nicht, inwieweit es noch andere Möglichkeiten gibt. :dontknow:

 
PHP-Desaster
05-04-2009, 22:31 
 
Die Frage ist ja viel eher, ob der Browser Code in einem solchen Bild ausführt, obwohl getimagesize das Bild korrekt erkannt und ein vernünftiger Content-Type Header gesetzt ist. Würde ich mal verneinen, da gibt es bestimmt einen Haufen offensichtlicherer XSS- und sonstwas Lücken in deiner Website/Projekt/Whatever.

 
ArSeN
05-04-2009, 22:50 
 
Okay, ich bedanke mich ganz herzlich. :)

 
Click
16-04-2009, 17:09 
 
Original geschrieben von PHP-Desaster
Die Frage ist ja viel eher, ob der Browser Code in einem solchen Bild ausführt, obwohl getimagesize das Bild korrekt erkannt und ein vernünftiger Content-Type Header gesetzt ist. Würde ich mal verneinen, da gibt es bestimmt einen Haufen offensichtlicherer XSS- und sonstwas Lücken in deiner Website/Projekt/Whatever.

Ich glaube ich hab mal von nem Fall gelesen, wo der Internet Explorer dies getan hat. Kann es aber leider nicht mehr an einer Quelle belegen, da ich sie nicht emhr weiß und das suchen bei Google nahc "Internet Explorer Bild Javascript" o.ä. viel zu viel andere Ergebnisse ausspuckt. Aber wahrscheinlich hast du recht, dass es noch mehr als genug andere Sicherheitlücken auf 'ner Website zu stopfen gibt.

 
TobiaZ
16-04-2009, 17:34 
 
Ich meine mich auch zu erinnern, aber werde mir dann gar nicht mehr die mühe machen, danach zu suchen... ;)

Letztendlich ist das ganze damit auch eher eine Sicherheitslücke des Browsers.

 
onemorenerd
16-04-2009, 17:42 
 
Ja da war mal was ...

Den IE (6?) konnte man auf eine Bild-URL lenken. Er hat den vom Server angesagten Content-Type ignoriert und selbst versucht, den Dateityp zu ermitteln. Genauer gesagt hat er geprüft, ob es sich um eine Webseite handelt. Das tat er, in dem er nach HTML-Tags gesucht hat. Fand er welche, hat er die Ressource als Webseite gerendert.
Viele Bildformate haben in ihren Headern Platz für Kommentare oder sonstigen Text (ähnlich wie die ID3-Header bei MP3). Dort kann man HTML oder Javascript (mit <script>-Tags) reinschreiben. Der IE hats interpretiert. :goth:

Um Bilder auf diesen Exploit zu überprüfen, muss man eigentlich nur alle Header nach HTML-Tags durchsuchen und ggf. mit htmlspecialchars() behandeln.

 
Kropff
16-04-2009, 18:16 
 
geht sogar noch viel einfacher. erstell eine textdatei mit diesem code:
<script type="text/javascript">alert ("Jau");</script>
speicher die als bla.jpg ab, lies sie per php aus und der ie führt das script aus, selbst mit einem
header('Content-Type: image/jpeg');
erscheint die alert-box. da gibt es auch noch möglichkeiten, js-code in css zu verstecken. der verd***te ie frißt fast alles.

peter

 
PHP-Desaster
16-04-2009, 19:37 
 
Der IE führt den Code in Bildern aus, wenn der Content-Type-Header nicht den Markierungen im Bild entsprechen, also den ersten Bytes, beim Gif zum Beispiel die ersten 6 Bytes GIF87a bzw. GIF89a. Wenn der Server korrekt konfiguriert ist bzw. die Typenerkennung über ein Php-Skript läuft und korrekte Header gesendet werden, führt der IE das JavaScript nicht aus. Mit getimagesize und image_type_to_mime_type ist man damit aber nicht immer auf der sicheren Seite, da das BMP-Format zum Beispiel vom IE mit dem Content-Type image/x-ms-bmp erwartet, genannte Funktion aber image/bmp liefert. Bei heise gab es einen Artikel (http://www.heise.de/security/Risiko-durch-MIME-Sniffing-im-Internet-Explorer--/artikel/122187) dazu.

 
h3ll
16-04-2009, 19:44 
 
Original geschrieben von PHP-Desaster
Mit getimagesize und image_type_to_mime_type ist man damit aber nicht immer auf der sicheren Seite, da das BMP-Format zum Beispiel vom IE mit dem Content-Type image/x-ms-bmp erwartet, genannte Funktion aber image/bmp liefert.

Schlechtes Beispiel. Wer liefert schon BMP-Dateien aus? Die kann erstens nicht jeder Browser darstellen und zweitens ist das vollkommener Schwachsinn unkomprimierte BMP-Dateien übers Internet zu senden.

 
PHP-Desaster
16-04-2009, 20:17 
 
Schlechtes Beispiel. Wer liefert schon BMP-Dateien aus? Die kann erstens nicht jeder Browser darstellen und zweitens ist das vollkommener Schwachsinn unkomprimierte BMP-Dateien übers Internet zu senden.Ob BMPs sinnvoll sind oder nicht, sei dahingestellt. Wer Bilduploads erlaubt, den Dateityp mit getimagesize validiert und die erlaubten Typen nicht auf Standardtypen wie JPEG, PNG und GIF begrenzt, erlaubt durchaus BMPs. Wie das mit den anderen von getimagesize akzeptierten Datentypen und den ermittelten Mimetypes im IE aussieht, kann ich nicht sagen.

 
onemorenerd
16-04-2009, 20:58 
 
Original geschrieben von Kropff
geht sogar noch viel einfacher. erstell eine textdatei mit diesem code:
<script type="text/javascript">alert ("Jau");</script>
speicher die als bla.jpg ab, lies sie per php aus und der ie führt das script aus ...
Wenn das so ist, korrigiere ich mich. Man muss nicht nur die Header nach HTML-Tags durchsuchen sondern auch prüfen, ob die Datei wirklich so aufgebaut ist, wie es die Spezifikation des jeweiligen Dateityps verlangt.
Bleibt noch zu klären, wie sich der IE verhält, wenn man ein Bild so konstruiert, dass das Format korrekt ist, kein HTML in den Headern steht aber die Bilddaten, die ja i.d.R. irgendwie komprimiert sind, zufällig eine Zeichenfolge in sich haben, die einem HTML-Tag entspricht. Bei sowas helfen dann auch die PHP-Image-Funktionen oder Unix-Tools nicht weiter.

 
Kropff
17-04-2009, 10:21 
 
also zumindest wird kein js-code ausgeführt. habs getestet. allerdings klappt das mit php-code, wenn man keine überprüfung von get-parametern vornimmt. siehe auch hier (http://www.peterkropff.de/tutorials/sicher_programmieren/dateiuploads_1.htm) punkt 3.

peter


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:51 Uhr.