PHP Web Shells

🧠 Introduction

PHP (Hypertext Preprocessor) est un langage de script open-source, couramment utilisé pour le développement web côté serveur. En octobre 2021, PHP était le langage côté serveur le plus répandu, alimentant plus de 78 % des sites web dont la technologie est connue (selon W3Techs).

Son utilisation massive signifie que de nombreuses applications web tournent sur un backend PHP, ce qui représente une surface d'attaque potentielle pour un testeur d'intrusion. Une mauvaise configuration ou une vulnérabilité dans une application PHP peut permettre l'injection d'un web shell PHP, facilitant l'exécution de commandes arbitraires sur le serveur.


🔍 Exemple de contexte : rConfig

Prenons l’exemple concret de rConfig, une application de gestion de configuration réseau, ici en version 3.9.6. Celle-ci utilise PHP pour son backend, comme en témoigne la présence d’un fichier login.php.

Lorsqu’un utilisateur remplit le formulaire de connexion et clique sur le bouton « Login », les informations sont envoyées au serveur pour être traitées via du code PHP. Cette observation nous donne une indication importante : il est possible qu’un web shell PHP fonctionne si nous réussissons à l’y injecter.


⚙️ Manipulation : upload manuel d’un Web Shell PHP

Dans rConfig, les administrateurs peuvent gérer les fournisseurs de matériel réseau. En allant dans le menu Devices > Vendors > Add Vendor, une interface permet de renseigner un nom de fournisseur et de téléverser un logo.

C’est ici que nous allons tenter de téléverser un Web Shell PHP, en profitant d’une faille de vérification du type MIME.

Nous utiliserons le Web Shell PHP de WhiteWinterWolf. Celui-ci peut être téléchargé ou copié dans un fichier .php. L’interface de rConfig restreint l’upload à certains types de fichiers (ex : .png, .jpg, .gif), et refuse tout fichier .php.

💡 C’est ici qu’intervient Burp Suite.

🛠️ Étapes avec Burp Suite

  1. Configurer le proxy de votre navigateur pour rediriger le trafic HTTP vers Burp (127.0.0.1:8080).

  2. Intercepter la requête POST d’upload du fichier avec Burp.

  3. Modifier le Content-Type du fichier dans la requête HTTP, en le remplaçant par image/gif au lieu de application/x-php.

  4. Relâcher la requête (Forward) pour envoyer le fichier modifié au serveur.

La page affichera alors le message : Added new vendor NetVen to Database, indiquant que le fichier a été accepté et enregistré.

Dans la liste des fournisseurs, le logo de NetVen apparaît comme une icône de fichier inconnu (ripped paper), signalant que le fichier n’a pas été interprété comme une image — exactement ce que nous recherchions.


🖥️ Exploitation du Web Shell

Nous pouvons maintenant naviguer vers le chemin suivant pour activer notre Web Shell via le navigateur :

http://<IP_CIBLE>/images/vendor/connect.php

Cela nous donne une session shell non interactive dans le navigateur, à partir de laquelle nous pouvons exécuter des commandes sur le système Linux sous-jacent.


⚠️ Points d'attention avec les Web Shells

L’usage de web shells présente plusieurs limitations et risques :

  • 🔄 Suppression automatique : certains serveurs peuvent purger régulièrement les fichiers uploadés.

  • ⛓️ Command chaining limité : les chaînes de commandes (&&, |) peuvent ne pas fonctionner.

  • 🚫 Instabilité : la shell peut être lente, instable ou non interactive.

  • 🧾 Traces évidentes : un fichier .php non supprimé peut rester visible et prouver l’intrusion.

Lors d’un test d’intrusion, surtout dans un cadre black-box ou Red Team, il est recommandé de :

  • Privilégier les reverse shells si possible.

  • Supprimer tout fichier uploadé après usage.

  • Documenter toutes les méthodes utilisées (nom de fichier, hash SHA1/MD5, chemins, succès/échecs).

Cette documentation est cruciale pour le rapport de mission, permettant de prouver techniquement les actions réalisées tout en conservant la transparence vis-à-vis du client.


In the example shown, what must the Content-Type be changed to in order to successfully upload the web shell? (Format: .../... )

Comme mentionné dans le cours, nous devons replacet la valeur du Content-Type par image/gif.


Use what you learned from the module to gain a web shell. What is the file name of the gif in the /images/vendor directory on the target? (Format: xxxx.gif)

Nous accédons au site web de notre cible :

Nous nous connectons à l'aide des identifiants admin:admin.

Nous nous rendons ensuite dans le répertoire Devices>Vendors afin de renseigner dans un premier temps le nom de notre vendeur ainsi qu'une image, que nous allons utiliser pour modifier son contenu et afficher un PHP Web Shell :

Une fois ces éléments préparés, nous exécutons notre proxy et BurpSuite :

Une fois burp lancé et le proxy lancé, nous pouvons enregistrer les informations envoyées afin de les interceptés et de les modifier.

Une fois ceci effectué, nous pouvons observer la bonne interception de la requête via Burp :

Nous pouvons maintenant modifier notre requête et intégrer notre WebShell PHP :

Une fois la requête modifiée, nous pouvons l'envoyer au serveur.

Notre Shell envoyé, nous pouvons y accéder via le lien https://10.129.6.137/images/vendor/exploit.php :

Il nous est maintenant possible d'effectuer des commandes via l'interface Web de notre cible afin de récupérer le nom du fichier .gif présent dans le répertoire /images/vendor :

Le fichier .gif présent dans le répertoire /images/vendor est ajax-loader.gif.


Mis à jour