Ein Angreifer kann ein böswilliges Skript (z. B. PHP -Code) hochladen, indem er sich als Bild tarnt. Nennen Sie beispielsweise ein Skript mit einer PHP -Backdoor .jpg oder .png und laden Sie es hoch. Wenn Sie exif_imagetype () nicht verwenden, um den tatsächlichen Dateityp zu erkennen, kann Image_type_to_extesion () die rechtliche Erweiterung fälschlicherweise zurückgeben, die nachfolgende Logik irreführen und sogar im ausführbaren Verzeichnis speichern:
$filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// Falsche Verwendung:Keine Erkennungexif_imagetypeIst der Rückgabewert derfalse
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);
Wenn die hochgeladene Datei kein echtes Bild ist, z. B. ein gefälschtes PHP -Skript, aber die Erweiterung ist .JPG , kann ein Angreifer einen böswilligen Code ausführen, indem er http://m66.net/uploads/xxxx.jpg besucht.
Wenn exif_imagetype () den Dateityp nicht erkennt, gibt er false zurück. Wenn das Ergebnis zu diesem Zeitpunkt immer noch in Image_type_to_extension () übergeben wird, wird .Int (0) zurückgegeben, was zu Verwirrung im generierten Dateinamen und sogar logischen Ausnahmen führt. Zum Beispiel:
$type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// Wenn$typefürfalse,$extfür"."
Dies kann dazu führen, dass das Programm die falsche Dateierweiterung verwendet, nachfolgende Vorgänge beeinflusst und sogar Ressourcenleckage verursacht.
In einigen Serverumgebungen schlägt exif_imagetype () fehl, wenn PHP keine DateiInfo- oder EXIF -Erweiterungen aktiviert. Wenn Sie sich immer noch auf seine Ergebnisse verlassen und image_type_to_extension () übergeben, ist das Programm anfällig für Absturz oder Umgang logischer Fehler, was die Benutzererfahrung beeinflusst.
Einige Sicherheitsrichtlinien für Dienstbereitstellungen sind basierend auf Erweiterungen eingeschränkt, wie nur .JPG- und .png -Dateien dürfen zugegriffen werden. Wenn ein Angreifer den Dateinamen gefälscht und die Backend -Prüfung umgangen hat, kann der Server den Zugriff fälschlicherweise gewähren.
Beispielsweise wird eine Datei namens .php.jpg hochgeladen, das reale Format ist jedoch PHP. Nginx wird unter bestimmten Konfigurationen als .php -Datei ausgeführt, was zu schwerwiegenden Folgen führt:
<?php echo shell_exec($_GET['cmd']); ?>
Dann zugreifen Sie durch:
http://m66.net/uploads/backdoor.php.jpg?cmd=ls
Sie können den Server aus der Ferne steuern.
Um die oben genannten Risiken zu vermeiden, sollten folgende Maßnahmen ergriffen werden:
Verwenden Sie exif_imagetype () und bestimmen Sie, ob der Rückgabewert falsch ist
Verwenden Sie Finfo_File () , um die MIME -Typen weiter zu überprüfen
Eingeschränktes Upload -Verzeichnis nicht ausführbar
Vertrauen Sie nicht dem Benutzer ausgemeldeten Erweiterungen
Überprüfen Sie den Rückgabewert von Image_type_to_extension () mit der Whitelist
Beispielcode:
$filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);
if ($imageType === false) {
die('Nicht unterstützte Bildformate');
}
$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($ext, $allowed)) {
die('Nicht erlaubte Bildtypen');
}
$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);