Web - Faille upload

Les failles upload sont une famille de failles qui permettent a un ataquant d'envoyer des fichier dangeureux sur le serveur pour lire des fichier ou executer des commandes.
Ces faille sont souvant la conséquence d'une erreur de programation

Cas numéro 1: Aucune protection

On va commancer par un cas tres simple, il n'y a aucune protection. L'utilisateur peut upload n'importe quel fichier.
ça a au moins le mérite de nous facilité la tache. Voici notre environement de test:

Il y a deux pages:

  • Une page index.html qui demande à l'utilisateur de choisir une image a upload
  • Un fichier upload.php qui upload le fichier sur le serveur dans le repertoire upload.
Index.html :
 
upload.php :

comme annoncée il n'y a aucune protection.
Il est donc possible d'upload un webshell.
Pour les plus néofeet, un websell est une page web qui permet d'envoyer des commandes systeme voir le retour de ces commandes.
Voici un exemple de webshell codé en PHP qui tres simple:

 

il faut juste upload un fichier .php avec ce code et joindre le fichier sur le serveur tout en initialisant la variable "cmd" dans l'url pour envoyer la commande.

Trève d'explication, allons upload notre fammeux fichier webshell.php sur le serveur:

Il est maintenant possible d'executer des commandes sur le serveur. On peux par la suite tenter une elevation de privilège mais ce n'est plus le sujet de cet article.

 

Cas numéro 2: Vérification avec le MIME transmit par le navigateur

 

Le MIME (Multipurpose Internet Mail Extensions) est un standard permettant d'indiquer le format et la nature d'un document.
Par exemple le MIME d'un fichier .php est application/x-php
celuis d'un fichier .jpg est image/jpeg
celuis d'un fichier .txt est text/plain

il est donc possible de véfifier que le mime reçu corespon au format d'image attendu afin que l'utilisateur ne puisse pas upload de fichier dangeureux (php ect ...) Mais cette vérification n'est pas tres effcicace.

En effet le MIME est communiqué par le navigateur web de l'utilisateur donc techniquement modifiable par l'utilisaeur.

Voici notre environement de test:

index.html :

 
upload.php :

Grace a burp il est possible d'editer nos requette et donc de modifier le MIME pour que notre fichier php soit upload

Il faut changer le champ "Content-Type" pour passer le passer de "application/x-php" à "image/png" :

 

On transmet le paquet modifié, on retourne sur le navigateur web et là magie 🙂 notre fichié PHP est upload: