hacktricks/pentesting-web/file-inclusion/lfi2rce-via-temp-file-uploads.md
2023-06-03 13:10:46 +00:00

6.1 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Téléchargements de fichiers PHP

Le moteur PHP, lorsqu'il reçoit un paquet POST avec des fichiers codés RFC 1867, crée un ou plusieurs fichiers temporaires qui sont utilisés pour stocker les données des fichiers téléchargés. Un script PHP gérant les téléchargements de fichiers doit utiliser la fonction move_uploaded_file pour déplacer le fichier temporaire téléchargé à l'endroit souhaité (si le script nécessite que le fichier existe après sa terminaison). Lorsque le script se termine, le moteur PHP supprime tous les fichiers temporaires pour les fichiers qui ont été téléchargés (s'il en reste après la fin du script).

{% hint style="info" %} Comme l'attaquant connaîtra généralement l'emplacement de ces fichiers temporaires, en cas de Local File Inclusion, il pourrait charger le fichier téléchargé et obtenir RCE. {% endhint %}

Le principal problème pour accéder au fichier est essentiellement de deviner son nom (qui sera "aléatoire").

Exploitation sous Windows

Pour générer le nom aléatoire sous Windows, PHP utilise la fonction GetTempFileName. En examinant la documentation, nous pouvons trouver l'explication suivante : La fonction GetTempFileName crée un nom de fichier temporaire de la forme suivante :

<path>\<pre><uuuu>.TMP

  • Le chemin est upload_tmp_dir qui est normalement C:\Windows\Temp
  • Le préfixe est généralement : "php"
  • Le <uuuu> est une valeur hexadécimale unique. Cependant :
    • Seuls les 16 bits inférieurs du paramètre uUnique sont utilisés. Cela limite GetTempFileName à un maximum de 65 535 noms de fichiers uniques si les paramètres lpPathName et lpPrefixString restent les mêmes. Il est possible de le forcer par la méthode brute.

Comme nous l'avons vu, il est assez facile de trouver le fichier temporaire dans les systèmes Windows. Et cela va devenir plus facile car la force brute n'est pas nécessaire ici, grâce à une certaine particularité de FindFirstFile qui permet d'utiliser des masques (<< comme * et > comme ?) dans les chemins LFI sur Windows. Grâce à cela, on peut former un chemin d'inclusion comme celui-ci :

http://site/vuln.php?inc=c:\windows\temp\php<<

(Dans certains cas, un masque plus spécifique peut être nécessaire, tel que php1<< ou phpA<<). Vous pouvez effectuer une attaque par force brute avec des masques plus spécifiques jusqu'à ce que vous trouviez votre fichier temporaire téléchargé.

Exploitation GNU/Linux

La valeur aléatoire du nom de fichier est suffisamment bonne pour ne pas être prévisible ni attaquable par force brute. Pour plus d'informations, consultez les références.

Références

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥