Retour à la liste des tutoriels
Mon serveur web est opérationnel, et héberge deux sites :
Chacun des deux sites doit-être indépendant : comme deux maisons, on ne rentre pas sans être invité !
Or, par défaut, je peux accéder avec un script PHP à n'importe qu'elle page !
Voici un script permettant d'illustrer mes propos (Proof of Concept) :
<?php $f = fopen('/var/www/default/www/index.html', 'r'); echo fread($f, 150); fclose($f); ?>
Ce script exécuté depuis www.anael.eu retourne le contenu de la page d'index par défaut :
<html><body><h1>It works!</h1> <p>This is the default web page for this server.</p> <p>The web server software is running but no content has been added, yet.</p> </body></html>
Il s'agit d'une faille de sécurité importante : que se passerait-il si j'accédais à un fichier contenant de utilisateurs / mot de passe appartenant à un autre site !
PHP comporte une directive de configuration permettant de limiter les répertoires auxquels un script peut avoir accès !
Pour ce faire, il faut éditer le fichier de configuration Apache du domaine
nano /etc/apache2/sites-available/anael.eu
Et définir un répertoire dans l'arborescence qui sera le répertoire le plus proche de la racine du système de fichier auquel les scripts PHP du domaine pourront accéder :
<IfModule mod_php5.c> php_admin_value open_basedir /var/www/vhosts/anael.eu/www/ </IfModule>
Rechargement de la config Apache
service apache2 reload
La configuration de PHP empêche maintenant de remonter dans l'arborescence de fichiers.
Afin de s'en assurer, on relance le script PoC :
[Sun Jun 20 02:21:23 2010] [error] [client 88.191.122.115] PHP Warning: fopen() [<a href='function.fopen'>function.fopen</a>]: open_basedir restriction in effect. File(/var/www/default/www/index.html) is not within the allowed path(s): (/var/www/anael.eu/www/) in /var/www/anael.eu/www/poc.php on line 2
Cette configuration permet de parer à un très grand nombre d'attaques, réduisant la zone de dégâts uniquement au répertoire contenant le site web fautif !
<IfModule mod_php5.c> php_admin_value open_basedir /var/www/vhosts/anael.eu/www/:/tmp/:/dev/null/ </IfModule>