====== File Upload ====== ===== Description ===== **L'upload de fichier consiste à transférer un fichier d'un utilisateur vers un serveur web. Il s'agit de l'opération inverse du téléchargement (download). Ceci peut par exemple permettre à un utilisateur de mettre en ligne des photos, des images etc. L'upload de fichier ou file upload n'est pas une vulnérabilité en soit, mais le fait de ne pas contrôler ce que l'utilisateur upload sur le serveur constitue une vulnérabilité.** En effet, un attaquant peut potentiellement uploader un fichier malveillant tel qu'un web shell qui est une interface shell permettant l'accès et le contrôle à distance d'un serveur Web ainsi que l'exécution de commandes arbitraires. ===== Pré-requis d'exploitation ===== Pour exploiter cette vulnérabilité, il est nécessaire d'avoir accès à un serveur web proposant une fonctionnalité d'upload, avec des contrôles et mécanismes de protection insuffisants permettant de télécharger un web shell. ==== Compétences nécessaires ==== * Connaissance du protocole HTTP ; * Connaissance du type MIME ; * Connaissance sur les types de fichiers et leurs extensions ; * Connaissance des techniques employées pour contourner certains contrôles. ==== Ressources nécessaires ==== * Outils de modification et/ou d’interception de requêtes (Burp, Curl). ===== Flux d'exécution ===== ==== Explorer ==== Énumérer les fonctionnalités permettant d'uploader des fichiers et identifier les répertoires dans lesquels ces derniers vont être téléchargés. ==== Expérimenter ==== Lister les différentes extensions et les différents type MIME acceptés par le serveur web. ==== Exploiter ==== ===== Conséquences potentielles ===== Le succès de ce type d'attaque peut permettre : * L’exécution de commandes sur l'hôte de l'application avec le niveau de privilège de l'utilisateur exécutant le service web ; * L'utilisation de l'hôte de l'application comme machine de rebond pour mener des attaques sur le réseau interne, ou sur Internet ; * L'utilisation de l'hôte de l'application pour miner de la cryptomonnaie ; * Le déploiement d'une backdoor pour maintenir un accès persistant sur l'hôte de l'application. ===== Contres-mesures ===== Les contre-mesures suivantes peuvent être mises en œuvre : * S'assurer que le serveur web est à jour avec tous les correctifs pour être protégé contre les vulnérabilités connues ; * S'assurer que les autorisations de fichiers dans les répertoires du serveur web à partir desquels les fichiers peuvent être exécutés sont définies sur les paramètres de **moindre privilège**, et que le contenu de ces répertoires est contrôlé par une liste d'autorisations ; * 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 ; * Stocker les fichiers uploadés dans un répertoire sur lequel l'utilisateur du service web n'a pas les droits d'exécution (en dehors de la racine du serveur web) ; * Filtrer les extensions et type MIME avec un système de liste blanche plutôt que liste noire ; * 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'autoriser que les utilisateurs authentifiés à utiliser une fonction d'upload. ====== Comment cela fonctionne ====== ===== Exemple 1 ===== Le code suivant est un web shell basique. En exploitant une fonction d'envoi de fichier vulnérable sur un serveur PHP, on aura alors la possibilité d'exécuter des commandes arbitraires sur le système. Ce code reçoit un paramètre dans l'URL **cmd** correspondant à une commande shell (par exemple "cat /proc/version" ou encore "crontab -l") qui sera exécutée sur le système et dont le résultat sera affiché dans le corps HTML de la réponse HTTP : Command Execution Form
        
    
===== Exemple 2 ===== Voici un exemple de code PHP d'une fonctionnalité d'envoi de fichier vulnérable : File upload

File upload

You can just upload [jpeg,gif] files.

The file has been uploaded here: $target_file.

"; } else { // Affichage d'un message d'erreur en cas de problème lors de l'upload du fichier echo "

Sorry, there was an error uploading your file.

"; } } ?>
Ce code n'effectue aucun contrôle côté serveur sur la nature du fichier envoyé. Le seul contrôle effectué est réalisé côté client via le paramètre "accept" dans la balise 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'importe quel type de fichier, comme par exemple un webshell. Pour prévenir l'exploitation de cette fonctionnalité, il aurait fallu implémenter des contrôles en PHP côté serveur sur le type MIME et l'extension du fichier envoyé, et renvoyer une erreur à l'utilisateur si le fichier ne correspond pas au type attendu. ===== Exemple 3 ===== Voici un exemple de code PHP vulnérable à des attaques de type MIME : File Upload

File Upload

Ce code est une page web qui permet à l'utilisateur de télécharger un fichier sur le serveur via un formulaire. Cependant, il est vulnérable à des attaques de type MIME, ce qui signifie que des fichiers malveillants peuvent être téléchargés sur le serveur en utilisant des en-têtes MIME falsifiées. ==== Correction du code : ==== Pour résoudre cette vulnérabilité, il est nécessaire de vérifier le contenu réel du fichier plutôt que de se fier uniquement à l'en-tête MIME fournie par le client. Voici un patch qui améliore la sécurité du téléchargement de fichiers : 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'extensions de fichiers autorisées ($allowedExtensions) pour s'assurer que seuls les fichiers d'images avec des extensions spécifiques (JPG, JPEG et PNG) sont autorisés à être téléchargés. Cela rend le processus d'envoi plus sûr et prévient les attaques de type MIME. ===== CWEs ===== * [[https://cwe.mitre.org/data/definitions/287.html|CWE-287 : Improper Authentication]] * When an actor claims to have a given identity, the software does not prove or insufficiently proves that the claim is correct. * [[https://cwe.mitre.org/data/definitions/553.html|CWE-553 : Command Shell in Externally Accessible Directory]] * 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://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Secure%20file%20upload%20in%20PHP%20web%20applications.pdf * https://github.com/flozz/p0wny-shell * https://www.prplbx.com/resources/blog/exploiting-file-upload-vulnerabilities/ * https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload * https://book.hacktricks.xyz/pentesting-web/file-upload * https://repo.zenk-security.com/Techniques%20d.attaques%20%20.%20%20Failles/Webhacking:%20les%20failles%20php.pdf * https://repo.zenk-security.com/Techniques%20d.attaques%20%20.%20%20Failles/Securite%20PHP%20-%20Faille%20upload.pdf ====== Retour fiches vulnérabilités ====== * [[cyber:vulnerabilite:accueil|Cyber fiches vulnérabilités]]