Un attaquant peut télécharger un script malveillant (comme le code PHP) en se faisant passer pour une image. Par exemple, nommez un script contenant une porte dérobée PHP .jpg ou .png et téléchargez-la. Si vous n'utilisez pas eXif_imageType () pour détecter le type de fichier réel, Image_Type_To_Extension () peut renvoyer par erreur l'extension juridique, tromper la logique suivante et même l'enregistrer dans le répertoire exécutable:
$filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// Mauvaise utilisation:Aucune détectionexif_imagetypeEst la valeur de retour lafalse
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);
Si le fichier téléchargé n'est pas une vraie image, comme un faux script PHP, mais l'extension est .jpg , un attaquant peut exécuter du code malveillant en visitant http://m66.net/uploads/xxxx.jpg .
Lorsque exif_imageType () ne reconnaît pas le type de fichier, il renvoie false . Si le résultat est toujours transmis dans image_type_to_extension () pour le moment, .int (0) sera retourné, entraînant une confusion dans le nom de fichier généré et même des exceptions logiques. Par exemple:
$type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// si$typepourfalse,$extpour"."
Cela peut amener le programme à utiliser la mauvaise extension de fichier, affecter les opérations ultérieures et même provoquer une fuite de ressources.
Dans certains environnements de serveur, exif_imageType () échoue si PHP n'activait pas les extensions FileInfo ou EXIF . Si vous comptez toujours sur ses résultats et que vous passez Image_Type_To_Extension () , le programme est enclin à écraser ou à gérer les erreurs logiques, affectant l'expérience utilisateur.
Certaines politiques de sécurité du déploiement de services sont limitées en fonction des extensions, telles que seuls les fichiers .jpg et .png sont autorisés à être accessibles. Si un attaquant a forgé le nom du fichier et contourné la vérification du backend, le serveur peut incorrectement accorder un accès.
Par exemple, un fichier nommé .php.jpg est téléchargé, mais le format réel est PHP. Nginx sera exécuté sous certaines configurations en tant que fichier .php , entraînant de graves conséquences:
<?php echo shell_exec($_GET['cmd']); ?>
Puis accès par:
http://m66.net/uploads/backdoor.php.jpg?cmd=ls
Vous pouvez contrôler à distance le serveur.
Afin d'éviter les risques ci-dessus, les mesures suivantes doivent être prises:
Utilisez exif_imageType () et déterminez si la valeur de retour est fausse
Utilisez finfo_file () pour vérifier davantage les types de mime
Répertoire de téléchargement restreint non exécutable
Ne faites pas confiance aux extensions soumises par l'utilisateur
Vérifiez la valeur de retour de l'image_type_to_extension () à l'aide de la liste blanche
Exemple de code:
$filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);
if ($imageType === false) {
die('Formats d'image non pris en charge');
}
$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($ext, $allowed)) {
die('Types d'images non autorisés');
}
$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);