Nouveau sujet Répondre Imprimer Syndication RSS 2.0

Problème de register globals

Liens exploitant un mauvais nettoyage des register globals
Nouvelle étincelle
Avatar de Mazzu
  • Messages : 8
  • Inscrit : 12 Novembre 2008
  Lien vers ce message 13 Novembre 2008, 1:53
  1. Type de bug : Faille cross scripting
  2. Zone du forum affectée : Autre
  3. Priorité du bug : Moyenne
  4. Description : Bonjour !

    Je me suis aperçu qu'il a un problème dans le nettoyage pour (ou
    contre) le register_globals.

    La méthode Http::clean_gpc() sert à nettoyer les variables
    globales créées si la directive register_globals est activé.
    Le problème est qu'elle pourrait supprimer trop de variables globales.

    Voyez, par exemple, les erreurs que peut générer ce problème :
    - http://2fighteur.free.fr/forum/index.php?GLOBALS
    - http://2fighteur.free.fr/forum/index.php?_COOKIE (perte de
    connexion dans ce cas particulier pour les utilisateurs connectés)

    Ce n'est pas grave mais il serait toujours possible, dans le forum
    ou autre part, de mettre un lien
    <a href="http://2fighteur.free.fr/forum/index.php?_COOKIE">Cliquez
    ici http://2fighteur.free.fr/forum/index.php</a>
    qui déconnecterait les utilisateurs du forum connectés qui
    cliquerait dessus.

    Sinon, une image dans un post du forum ou autre part <img
    src="http://2fighteur.free.fr/forum/index.php?_COOKIE" />
    peut avoir les mêmes effets.

    Par contre, ce problème concerne potentiellement toutes les pages
    du forum. C'est une faille de type XSRF.
  5. Elément de réponse : Voici une proposition de remplacement pour Http::clean_gpc().
    A noter que ce n'est pas parfait vu que les variables globales de
    main/globals.php ne sont pas prises en compte.

    public static function clean_gpc()
    {
        // On supprime toutes les variables crées par la directive register_globals
        // On stripslashes() toutes les variables GPC pour la compatibilité DBAL
        $gpc = array('_GET', '_POST', '_COOKIE');
        $magic_quoted = array('_GET', '_POST', '_COOKIE', '_REQUEST');
        $keep_globals = array('_GET', '_POST', '_COOKIE', '_REQUEST', 'GLOBALS', '_SERVER', '_COOKIE', '_ENV', 'debug');
    
        $magic_quote_gpc = get_magic_quotes_gpc() || get_magic_quotes_runtime();
        $register_globals = ini_get('register_globals') ;
    
        if ($register_globals)
        {
            foreach ($gpc AS $value)
            {
                foreach ($GLOBALS[$value] AS $k => $v)
                {
                    if (!in_array($k, $keep_globals))
                    {
                        unset($GLOBALS[$k]);
                    }
                }
            }
        }
    
        if ($magic_quote_gpc)
        {
            foreach ($magic_quoted AS $value)
                $GLOBALS[$value] = array_map_recursive('stripslashes', $GLOBALS[$value]);
            }
        }
    }
  6. Fichier(s) : main/class/class_http.php
  7. Base de donnée utilisée : MySQL 4
  8. Type de serveur : Apache (généralement unix)
 
Chef du projet FSB
Avatar de Genova
  • Age : 24 ans
  • Messages : 14653
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 13 Novembre 2008, 14:58
Sujet archivé pour la raison suivante : Effectivement c'est logique, j'ai appliqué ta modification sur la version en dev, merci ;)


Cause Im as free as a bird now, And this bird you can not change. - Freebird - Lynyrd Skynyrd
There's someone in my head but it's not me. - Brain damage - Pink Floyd
I said baby, you know Im gonna leave you. - Babe I'm gonna leave you - Led Zeppelin
Father ? yes son, I want to kill you - The end - The Doors
 
Répondre


.