Never Trust Foreign Data

Suite à la lecture d’un article sur Developpez.com j’ai décidé de vous écrire un petit article sur une faille XSS en PHP.

Tout bon développeur web se doit de connaître la régle « Never trust foreign data » (Ne jamais faire confiance aux données étrangères) . Nous connaissons tous très bien les problèmes que peuvent causer des injections de code malicieux par POST ou GET, mais cette fois ci, c’est une injection par la variable $_SERVER[‘PHP_SELF’] que je vais vous présenter.

Pour rappel :

PHP_SELF
Le nom du fichier du script en cours d’exécution, par rapport à la racine web. Par exemple, $_SERVER[‘PHP_SELF’] dans le script situé à l’adresse http://www.monsite.com/test.php/foo.bar sera /test.php/foo.bar. La constante __FILE__ contient le chemin complet ainsi que le nom du fichier (i.e. inclut) courant. Si PHP fonctionne en ligne de commande, cette variable contient le nom du script depuis PHP 4.3.0. Dans les versions antérieures, cette variable n’était pas disponible.

Comme la doc PHP nous le montre bien, $_SERVER[‘PHP_SELF’] contient tout ce qu’il y a entre les premier slash suivant le domaine et le point d’interrgation qui nous permet de passer des variables dans l’url. L’utilisateur a donc la possibilité d’agir sur cette variable par le biais de l’URL qu’il saisira dans son navigateur : il ne faut donc plus avoir une confiance aveugle en cette variable.

C’est en partant de cette remarque qu’il a été découvert une possible injection de code malicieux. Voyons tout de suite un exemple : construisons un simple formulaire HTML :




Faille $_SERVER['PHP_SELF']


'.print_r($_POST, true).'

';
}
?>


Login
Password



En appelant cette page par une URL classique (http://127.0.0.1/index.php par exemple) et sans aucune mauvaise intention , tout se passe correctement : le formulaire s’affiche et lorsqu’on le soumet on a l’affichage du tableau $_POST; mais une personne mal intentionnée pourrait facilement injecté un code javascript en utilisant une URL du type :

http://127.0.0.1/failleSelf/index.php/%22%3E%3Cscript%3Ealert(‘Injection’)%3C/script%3E%3Cdata%22

Qui donne une fois décodée : http://127.0.0.1/index.php/ »><script>alert(‘Injection’)</script><data »

En appelant la page de cette manière vous réalisez une injection de code Javascript qui se traduira par l’affichage d’une joli boîte de dialogue. Bien sûre ce type d’injection peut conduire à des dommages bien plus importants.

Pour plus de détails sur cette faille, je vous renvoie vers l’article original sur Developpez.com.

Pendant que nous sommes dans les failles, j’en profite pour vous donner un lien vers un site qui peut être très utile : Milw0rm : ce site répertorie différentes failles trouvées sur plusieurs types d’applications; vous remarquerez d’ailleurs très facilement le message sur la page d’accueil indiquant que nous sommes dans le mois du PHP 😀

4 commentaires »

  1. IndicaDesBois nous dit :

    Le 17 mars 2007 @ 11:43

    Good article et Bon lien pour les failles, merci 😉

  2. br1o nous dit :

    Le 18 mars 2007 @ 01:19

    Bien vu, l’ami, mais pour être valide il faut mettre blah blah !!!
    ok,je sors… 😉
    a++

  3. br1o nous dit :

    Le 18 mars 2007 @ 01:21

    lol, Comment ? on a perdu le plugin qui affiche les scripts ? 😉 (kektafé thanh ?)

  4. Brice nous dit :

    Le 20 mars 2007 @ 12:46

    Personnellement à la place de (on peut mettre ça à la place : plus court, j’ai découvert ça il y a pas lomgtemp) j’utilise un simple action=’#’ ça limite tous ça et c’est valide xhtml strict.

Flux RSS des commentaires de ce billet · URI de TrackBack

Laisser un commentaire

Bad Behavior has blocked 0 access attempts in the last 7 days.