File Inclusion : exploitation avancée

Le partage, c’est bien quand c’est utile :

L’exploitation dont il est question dans cet article tire profit des protocole supportés par les fonctions d’inclusion tels que include() ou require() en PHP. Bien que nous n’aborderons ici que le cas de PHP, le sujet peut très facilement être porté dans un autre environnement.

Situation de base

On peut légitimement se demander dans quels cas ces protocoles peuvent être utilisés à la place des classiques inclusions de fichiers locaux ou des inclusions de ressources via http(s) ou ftp(s). Il peut y avoir plusieurs raisons.

  • Le webmaster peut tout simplement filtrer leur usage en oubliant l’existence d’autres protocoles.
  • Une limitation en nombre de caractères peut empêcher l’utilisation d’une url de type http://www.votreserveur.com/ressource.ext
  • Héberger des scripts malicieux sur un serveur tierce peut compromettre le pirate. De plus, cela requiert plus de temps.

Quelques-uns des protocoles intéressants

Le protocole php://input est très intéressant en cas de limite de taille. Il ne fait que 11 caractères et permet d’injecter autant de code que l’on veut. L’interpréteur PHP va exécuter le contenu du paquet HTTP, c’est-à-dire les données POST. Il suffit dès lors de manipuler le paquet pour y rajouter des données.

Dans le cas où php://input n’est pas utilisable et qu’il n’y a pas de limite de taille très contraignante, on pourrait utiliser le protocole data. L’inclusion de quelque chose comme "data://text/plain;<.?php echo 'hello'; ?>" affichera 'hello' dans la page.

Ces deux protocoles sont restreints par allow_url_include dans php.ini mais pas par allow_url_fopen.

Le protocole rar n’est restreint par aucune de ces deux options mais demande l’installation de l’extension rar.

Les autres protocoles disponibles

Concernant PHP, vous pouvez consulter la liste complète des protocoles supportés. Pour les autres environnements, une petit recherche dans la documentation ne devrait pas demander énormément de temps.

Pour se protéger des inclusions de ce type, la technique la plus sûre reste une whitelist (liste blanche) des pages connues.

Le partage, c’est bien quand c’est utile :