it-swarm.com.de

Ist es möglich, ein PHP-Skript in einer Bilddatei auszuführen?

Ich habe eine PHP-Website zum Hochladen von Bildern. Benutzer können Bilder auf meine Website hochladen. Ein Benutzer behauptet, er könne meine Website mit einem hochgeladenen Bild hacken.

Ich habe alle Bilder, die er auf meinen Server hochgeladen hat, mit dem Editor geöffnet. Die letzte Zeile eines Bildes lautet:

À[email protected] ;
<?php

echo "test ok";
?>

Kann er meine Website mit diesem Bild hacken? Wie verhindere ich, dass Benutzer solche Bilder hochladen?

18
open source guy

Das Hochladen von Bildern (alle Dateien im Allgemeinen) ist sehr schwer vollständig sicher zu machen - insbesondere in PHP, das viele Angriffsmethoden bietet.

Wenn Sie beispielsweise das Bild durch Aufrufen anzeigen

require($someImage);

und dieses Bild enthält PHP Code im Inneren (wie das, das Sie gepostet haben), es kann als solches interpretiert und ausgeführt werden.

Ich vermute, wenn er behauptet, er besitze Ihre Website, hat er höchstwahrscheinlich. Das Bild, das Sie selbst bereitgestellt haben, kann nur "test ok" drucken. Dieser Code kann jedoch leicht gegen einen Code ausgetauscht werden, der unbefugten (sogar völlig uneingeschränkten) Zugriff auf Ihre Site und Ihren Server ermöglicht.

Um sicherzustellen, dass die auf Ihre Site hochgeladene Datei tatsächlich ein Bild ist, verarbeiten Sie sie erneut mit Gd (oder Imagick) und speichern Sie das verarbeitete Bild. Es ist eine schlechte Praxis, das Originalbild zu speichern, insbesondere unter Verwendung des ursprünglichen Dateinamens, da dies für viele andere Angriffe (z. B. Verzeichnisüberquerung und Überschreiben von Dateien) geöffnet ist.

Weitere Informationen: https://www.owasp.org/index.php/Unrestricted_File_Upload

13
GBC

Ja, Ihr Server könnte run PHP Code in einer Bilddatei wenn er nicht richtig konfiguriert ist:

http://www.phpclasses.org/blog/post/67-PHP-security-exploit-with-GIF-images.html

Ein Beispiel dafür ist image.gif.php. Eine Datei kann sowohl ein gültiges Bild als auch ein gültiges PHP Skript, es reicht nicht aus, nur die Bildgröße zu überprüfen) sein oder andere Eigenschaften. Es reicht auch nicht aus, Strip-Metadaten , ein unkomprimiertes GIF kann PHP als Bilddaten enthalten (obwohl es möglicherweise nicht hübsch ist), PNG unterstützt beliebige Datenblöcke .

Der Fehler besteht darin, Uploads mit unzureichender Überprüfung der Integrität zu akzeptieren und insbesondere zu versuchen, unerwünschte Dateinamen (z. B. .php) Durch Verwendung eines nicht verankerten regulären Ausdrucks wie \.(png|gif|jpg|jpeg) (kein $ - Anker) zu verhindern. , und , damit diese Bilder aus einem Verzeichnis mit PHP Verarbeitung aktiviert) bereitgestellt werden können. Best Practice ist, dass Sie dies wahrscheinlich tun sollten Verwenden Sie niemals einen vom Benutzer angegebenen Dateinamen wie er ist.

Dies sind ziemlich klassische Datenvalidierung und Eingabevalidierung Fehler.

Wenn Sie den Anweisungen PHP-Installation (für Apache 2) folgen, wird in Ihrer Apache-Konfiguration Folgendes angezeigt:

<FilesMatch "\.ph(p[2-6]?|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

Beachten Sie den Anker $, Der verhindert, dass file.php.gif Von PHP interpretiert wird. (Was in diesen Anweisungen fehlt, ist sicherzustellen, dass PHP durch einen <Directory> - Kontext begrenzt ist, der nur vertrauenswürdigen Code enthält, und vom Webserver-Benutzer nicht beschreibbar.)

Wenn Sie diese Anweisungen nicht befolgen und stattdessen mod_mimeAddType (oder AddHandler) verwenden:

AddType application/x-httpd-php .php      # STOP! 

Dies kann das gleiche Problem verursachen, da mod_mime Möglicherweise etwas tut, was Sie nicht erwarten mit mehreren Erweiterungen. Siehe http://blog.dynom.nl/archives/Be-careful-with-double-extensions_20081024_25.html (danke an Hendrik Brummermann für diesen Hinweis) . Dieses Risiko kann durch einen korrekt konfigurierten <Directory> - Kontext verringert werden, um nur vertrauenswürdigen Code zuzulassen.

Dieses Dokument (PDF) ist etwas alt, deckt jedoch die Abschwächungen gut ab: http://www.net-security.org/dl/articles/php-file-upload.pdf

Eine weitere mögliche Ursache für Probleme sind unsichere include/require Anweisungen (ebenfalls in dieser PDF-Datei behandelt), mit denen ein Angreifer include hochgeladene Inhalte durch Ändern von Abfragezeichenfolgen oder HTTP-Anforderungsheadern hochladen kann.

Siehe auch die aktuelle verwandte Frage: Risiken eines PHP Bild-Upload-Formulars (obwohl ich es nicht für richtig halte, sich zur Überprüfung auf getimagesize zu verlassen images) und Verwenden Sie PHP, um die hochgeladene Bilddatei auf Malware zu überprüfen? (die eine Reihe nützlicher Links enthält).

20
mr.spuratic

Ich gehe davon aus, dass Sie LAMP ausführen (und eine Antwort für andere PHP-Setups wäre sehr ähnlich).


Höchstwahrscheinlich kann sein Code nichts mit Ihrer Site tun.

Angenommen, Apache stellt Dateien aus /var/www Auf Ihrem Server bereit. Angenommen, jemand besucht index.php Auf Ihrer Website.

  1. Apache wird erhalten, dass sie nach /index.php Suchen.
  2. Apache sucht nach der Datei /var/www/index.php
  3. Wenn Apache mod_php ausführt, wird überprüft, ob index.php In irgendeiner Weise mit einer Regel in der Konfigurationsdatei mod_php übereinstimmt. Ihre mod_php-Konfigurationsdatei (wahrscheinlich bei /etc/Apache2/mods-available/php5.conf) Ist höchstwahrscheinlich eine Obermenge dieses minimalen Beispiels, das ich unten erstellt habe:

    <IfModule mod_php5.c>
        <FilesMatch ".+\.ph(p[345]?|t|tml)$">
            SetHandler application/x-httpd-php
        </FilesMatch>
    </IfModule>
    
    • Wenn der Dateiname übereinstimmt, führt Apache die Datei über einen PHP-Interpreter aus und erstellt eine Webseite, die dem Benutzer zur Verfügung gestellt wird.
    • Wenn der Dateiname nicht übereinstimmt, wird Apache dies nur dem Benutzer bereitstellen.
    • (Diese Details überspringen viele Teile von Apache, die ich hier nicht für relevant halte.)

Angenommen, ein Benutzer lädt ein Bild hoch, beispielsweise evil_image.png, Und es enthält beliebigen PHP Code).

Nehmen wir auch an, Sie stellen es Benutzern von irgendwoher zur Verfügung, beispielsweise unter /images/evil_image.png (Also innerhalb Ihres Dateisystems /var/www/images/evil_image.png).

Wenn jemand versucht, dieses Bild abzurufen, indem er unter /images/evil_image.png Auf Ihre Website zugreift, führt Apache die oben beschriebenen Schritte aus. In Schritt 3 wird /images/evil_image.pngstimmt nicht mit dem Muster überein aus Ihrer Konfigurationsdatei, also Sie werden den Code nicht als PHP ausführen. Sie werden das Bild einfach dem Benutzer bereitstellen.

Der Benutzer erhält die Bilddatei, in der der böswillig gestaltete Text gespeichert ist. Wichtig ist, dass Ihr Server nicht versucht hat, den Code auszuführen, wodurch er unwirksam wird..


Ich sage nicht, dass es unmöglich ist, diesen Code auszuführen. Ich werde Ihnen sagen, dass Sie die Konfiguration Ihres Webservers dringend verpassen müssen, damit dieser Code ausgeführt wird.

1
David Mah