Basics

Dans une page web il y a souvent du code redondant. Par exemple le menu de la page, le pied de page ou encore la bannière sont des éléments que l’on retrouve sur chaque pages. Pour éviter d’avoir à recopier du code (ou le copier/coller), on peut décider de créer un fichier banniere.html, footer.html, ou encore menu.html et les inclure dynamiquement dans nos pages.

Pour cela on se servira de 4 fonctions PHP : require(), require_once(), include() et include_once().

Quelles sont les différences entre ces fonctions ? Pour le « once », cela veut juste dire que le fichier sera inclus une seule fois. Quant aux fonctions require et include, la différence est que si la fonction include() ne trouve pas le fichier à inclure alors une erreur sera affichée mais le reste du code de la page sera quand même exécuté. Avec require(), si le fichier à inclure n’est pas trouvé alors le code n’est pas exécuté.

Dans tous les cas, si l’inclusion n’est pas sécurisée, un attaquant sera en mesure de lire n’importe quel fichier sur le serveur ou pire, inclure des scripts malicieux qui lui permettront de prendre le contrôle du serveur.

Voyons ce que ça donne avec un exemple. Ici j’ai trois fichiers :

Dans le fichier index.php nous avons notre fonction include :

<?php
	if(isset($_GET["page"])){
    	include_once($_GET["page"]);
    }
    else{
    	include_once("default.html");
    }
?>

Et dans les deux autres fichiers nous avons juste une ligne de texte :

Du coup, si dans mon URL je spécifie que je veux inclure la page « page1.html » :

http://localhost/index.php?page=page1.html

Je reçois bien son contenu :

A l’inverse si je ne spécifie pas de page à inclure, alors la page par défaut sera affichée :

http://localhost/index.php

Jusque là tout va bien. Mais qu’est ce qui se passerait si je voulais inclure un fichier qui n’existe pas ? Par exemple « motdepasse.txt » :

http://localhost/index.php?page=motdepasse.txt

On reçoit une erreur ! Retenez la bien car elle est typique d’une erreur d’inclusion et donc nous indique clairement que la faille include est présente. A partir du moment où nous avons détecté une faille include deux possibilités s’offrent à nous :

-La faille est de type locale (on parle alors de LFI pour Local File Include) et permet d’inclure des fichiers localement présents sur le serveur web.
-La faille est de type remote (on parle alors de RFI pour Remote File Include) et  permet d’inclure des fichiers présents sur d’autres serveurs.

  • Local File Include :

Si notre faille include est de type LFI alors cela veut dire qu’on va pouvoir inclure n’importe quel fichier présent sur le serveur vulnérable à commencer par le fichier /etc/passwd :

Suivant les fichiers disponibles on pourra trouver des identifiants de connexion à une base de données, des mots de passe, des fichiers confidentielles ou encore des fichiers de code source qui nous permettront de trouver d’autres vulnérabilités.

Voici une liste de fichiers intéressants à inclure.

Pour Linux:

/etc/issue
/etc/passwd
/etc/shadow
/etc/group
/etc/hosts
/etc/motd
/etc/mysql/my.cnf
/proc/[0-9]*/fd/[0-9]*   (first number is the PID, second is the filedescriptor)
/proc/self/environ
/proc/version
/proc/cmdline
/proc/sched_debug
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/self/cwd/index.php
/proc/self/cwd/main.py
/home/$USER/.bash_history
/home/$USER/.ssh/id_rsa
/var/run/secrets/kubernetes.io/serviceaccount

Pour Windows:

c:/boot.ini
c:/inetpub/logs/logfiles
c:/inetpub/wwwroot/global.asa
c:/inetpub/wwwroot/index.asp
c:/inetpub/wwwroot/web.config
c:/sysprep.inf
c:/sysprep.xml
c:/sysprep/sysprep.inf
c:/sysprep/sysprep.xml
c:/system32/inetsrv/metabase.xml
c:/sysprep.inf
c:/sysprep.xml
c:/sysprep/sysprep.inf
c:/sysprep/sysprep.xml
c:/system volume information/wpsettings.dat
c:/system32/inetsrv/metabase.xml
c:/unattend.txt
c:/unattend.xml
c:/unattended.txt
c:/unattended.xml
c:/windows/repair/sam
c:/windows/repair/system

Crédits @Swiskky : https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Directory%20Traversal

  • Remote File Inclusion :

Si la faille include est de type RFI alors là on va pouvoir inclure n’importe quel contenu venant de sites extérieurs. Autrement dit, un attaquant pourra inclure sur le serveur vulnérable un script malicieux qu’il aura hébergé sur son serveur à lui.

Par exemple si j’inclus http://google.com :

http://localhost/index.php?page=http://google.com/

Je vais avoir ce rendu :

Bien évidemment un attaquant n’inclura jamais une telle URL. A la place il préféra inclure une backdoor ou encore un webshell afin de prendre le contrôle du serveur. Pour que cette exploitation soit possible il faudra néanmoins que la directive allow_url_include ait la valeur suivante:

allow_url_include = On