# 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.

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FL5rq4qEmvKBknIdclgvk%2Fimage.png?alt=media&#x26;token=1c327818-9ed8-4771-9a1b-af65ebac1307" alt=""><figcaption></figcaption></figure>

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é.

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2Fj3YMk5F3dXJr03wNXZU6%2Fimage.png?alt=media&#x26;token=0d2d710d-73dc-4341-b736-35effa411c16" alt=""><figcaption></figcaption></figure>

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.

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FvYvZPweedYHJettxdNjY%2Fimage.png?alt=media&#x26;token=4a8ecde1-70e6-49fe-b761-b6ee5f8c290b" alt=""><figcaption></figcaption></figure>

***

### 🖥️ 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
```

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FNZi6lncKC0zvlHhdqqNM%2Fimage.png?alt=media&#x26;token=9d1a42d1-e15e-4939-a408-ca543fc65a6b" alt=""><figcaption></figcaption></figure>

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 :&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FRVTKyK43nU8MC98yeklq%2Fimage.png?alt=media&#x26;token=eedf09ef-8399-4b57-91b1-4895f9f51689" alt=""><figcaption></figcaption></figure>

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 :&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FaMFULS9N6PEZiKXBTSmS%2Fimage.png?alt=media&#x26;token=cb576a7b-e1e7-4680-90ad-63a85d6bfe6a" alt=""><figcaption></figcaption></figure>



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

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FWZJJsBTRtansc6y34KC1%2Fimage.png?alt=media&#x26;token=cf7024ec-4c99-45fa-bd48-56e87815d685" alt=""><figcaption></figcaption></figure>

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2F7bwFoPHqstPmsLfzVqrF%2Fimage.png?alt=media&#x26;token=30e56526-6a85-403c-b935-bbda3152d95c" alt=""><figcaption></figcaption></figure>



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 :&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FJYYttDDBwx7zk9YLcnDR%2Fimage.png?alt=media&#x26;token=5b80b7f4-29af-4e99-a095-756ec66c2b86" alt=""><figcaption></figcaption></figure>



Nous pouvons maintenant modifier notre requête et intégrer notre [WebShell PHP](https://raw.githubusercontent.com/WhiteWinterWolf/wwwolf-php-webshell/refs/heads/master/webshell.php) :&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FkOWvYs6gL3ai4YbIFKjz%2Fimage.png?alt=media&#x26;token=de771a35-fe5a-49ed-b9dd-cf712cf60942" alt=""><figcaption></figcaption></figure>



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](https://10.129.6.137/images/vendor/exploit.php) :&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FZ2Ba7Kc7sbnS2ol1ULdB%2Fimage.png?alt=media&#x26;token=75372acf-d564-4932-821c-e8d376d0cd37" alt=""><figcaption></figcaption></figure>



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 :**&#x20;

<figure><img src="https://428993362-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMFND1xZe6YAGbm2iLxIv%2Fuploads%2FmyPjClEkfcp384CZlb9M%2Fimage.png?alt=media&#x26;token=3bde45ec-b5fb-4002-b7df-ff0cc89ef945" alt=""><figcaption></figcaption></figure>



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

***
