Htaccess, ou comment contourner les mécanismes de dépôt de fichiers.
📂 Comment contourner les mécanismes de dépôt de fichiers ?
Introduction
Une vulnérabilité de type dépôt de fichier est une faille de sécurité permettant à un attaquant de déposer un fichier malveillant sur un système cible. Ce fichier malveillant peut ensuite être utilisé pour exécuter un code arbitraire, voler des données ou causer d’autres dommages.
Il existe de multiples façon de contourner les mécanismes de dépôt de fichier. Cet article est inspirée du challenge l33t-hoster de l’Insomni’hack Teaser 2019 CTF.
Alors suivez le guide !
Exemple de code vulnérable
L’objectif du challenge était de pouvoir exécuter des commandes sur le serveur distant à l’aide de la fonctionnalité de dépôt de fichier. Or, celle-ci semble bien protégée.
Le code source de la page est donnée ci-dessous.
|
|
Le rendu de la page est relativement simple :
Pour résumer l’analyse des filtres de sécurité :
- L’application vérifie l’extension du fichier. Si le fichier se termine par .php ou quelque chose de similaire, il est refusé.
- L’application vérifie le nom du fichier. Si le nom du fichier ne peut pas être divisé en deux fois avec le séparateur .php, il est refusé.
- L’application vérifie le contenu. Si la chaîne
<?
est présente dans le contenu, le fichier est refusé. - L’application vérifie l’en-tête. Si le fichier n’est pas une image, il est refusé.
- L’application vérifie la taille. Si la hauteur et la largeur du fichier ne sont pas égales à 1337, le fichier est refusé.
Comment faire ?
Choisir le bon fichier
Pour résumer, il n’est pas possible de télécharger de fichiers avec l’extension php
. L’objectif est donc d’obtenir la possibilité d’exécuter du code php dans un autre fichier que .php
. Pour cela, il est possible d’utiliser un fichier .htaccess
.
Mais qu’est-ce qu’un fichier .htaccess
?
Un fichier .htaccess est un fichier de configuration qui permet de modifier le comportement d’un serveur web Apache. Il est généralement situé dans le répertoire racine d’un site web, mais il peut également être placé dans des sous-répertoires.
Plus de détails ici : https://httpd.apache.org/docs/2.4/en/howto/htaccess.html
Un fichier .htaccess
peut avoir la configuration ci-dessous :
|
|
- La première ligne indique que l’on veut faire exécuter du PHP à l’aide de l’extension
.php16
. - La deuxième ligne indique un encodage particulier.
- La troisième ligne indique si le fichier à un encodage particulier.
- La quatrième ligne indique d’afficher les erreurs PHP (utile dans notre cas).
Ce fichier de configuration pourrait permettre d’obtenir une exécution de commande. Or, lors du dépôt, l’application donne l’erreur suivante :
lol filename is empty
En analysant le code, ce dernier divise la chaîne en deux avec .
et vérifie s’il y a bien deux parties. Il faut donc envoyer un nom de fichier comme ..htaccess
pour contourner ce filtre.
Erreur suivante :
not an image.
En effet, nous ne déposons pas une image mais un fichier de configuration. Il va falloir trouver quelque chose pour contourner le code ci-dessous :
|
|
Créer un fichier polyglotte
Qu’est-ce qu’un fichier polyglotte ?
Un fichier polyglotte est un fichier qui peut être interprété dans plusieurs langages différents. Il s’agit généralement d’un fichier binaire qui contient des données dans plusieurs formats, tels que des instructions de code, des données de configuration ou des données de texte.
La première astuce consiste à trouver un moyen de contourner le vérificateur d’images. La documentation PHP donne une indication sur la marche à suivre : http://php.net/manual/en/function.exif-imagetype.php
En bas de la page un format semble intéressant :
Ok mais qu’est-ce qu’un fichier XBM ?
X BitMap, abrégé XBM, est un format d’image numérique monochrome originellement conçu pour le système X Window, notamment pour les images de pointeur et d’icône.
La page contient un exemple :
|
|
Le format de xbitmap
est assez clair. La taille de l’image est noté sur les premières lignes du fichier à l’aide d’un #
. Ce format très proche du format .htaccess
permet de contourner la fonction exif_imagetype($tmp_name)
du programme.
Voici le contenu du nouveau fichier ..htaccess
:
|
|
Le fichier est correctement traité et déposé sur le serveur !
Contourner la protection anti-php
Un autre filtre empêche le dépôt de contenu PHP avec la vérification de la chaine de caractères <?
. Or, il est possible de contourner cette protection en encodant le payload.
En effet, PHP supporte plusieurs format d’encodage. Actuellement, l’écriture de base est en utf-8, mais PHP supporte également l’encodage utf-16.
En utf-8, un caractère est encodé sur 1 octet.
|
|
Or, en utf-16 l’encodage est effectué sur 2 octets.
|
|
Il a été choisi ici un encodage utf-16 Big Endian. Le premier caractère <
s’écrira donc 003c
en utf-16 au lieu de 3c
en utf-8. Avec cette astuce, le filtre est contourné.
Voici un petit script python pour automatiser la création de payload.
|
|
Il n’y a plus qu’à déposer et apprécier sa webshell bien méritée. Ouf ! 😂
Conclusion
Il est complexe de mettre en place une fonctionnalité de téléchargement de fichiers totalement sécurisée.
Pour se protéger contre les contournements utilisés dans ce challenge, le développeur aurait pu implémenter les sécurités suivantes :
- Utiliser les fonctions d’
ImageMagick
pour vérifier les fichiers avant de les déposer. - Mieux vérifier l’extension de fichier.
- Empêcher l’interprétation des fichiers
.htaccess
dans le répertoire. - Installer un WAF (Web Application Firewall) comme ModSecurity de Apache.
A retenir ! Ne faites jamais confiance aux entrées utilisateurs !