mars
2007
Tout le monde connait ( j’espère ), la règle ultime du « never trust foreign data », entendez par là ne faites confiance à aucune donnée externe.
On peut aussi falsifier $_SERVER, il n’echappe pas à la règle ( modification de la requête http manuellement par exemple ).
Et bien, n’echappe pas à la règle aussi, $_SERVER[‘PHP_SELF’], oui, cette variable est vulnérable, et vous allez voir qu’il n’est pas compliqué de la fausser
Prenons un exemple tout simple :
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
Si nous plaçons ce script par exemple à http://localhost/phpself.php, on s’attend sur un serveur configuré normalement, à avoir
<body>
<form action="/phpself.php">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
Et bien en fait, non.
En réalité, la variable $_SERVER[‘PHP_SELF’] peut être manipulée par le client, car elle contient tout ce qui se situe entre la partie du fichier appelé dans l’URI, et la rencontre du premier ? indiquant le début de la chaine de requête ( passage de paramètres ).
Ceci designe le contenu de la variable $_SERVER[‘PATH_INFO’] , et ce contenu est ajouté à $_SERVER[‘PHP_SELF’].
Ainsi, si on interroge notre page via http://localhost.com/phpself.php/on_injecte_ici
alors on a
<body>
<form action="/phpself.php/on_injecte_ici">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
Et donc bien entendu :
http://localhost/phpself.php/%22%3E%3Cscript%3Ealert(‘xss’)%3C/script%3E%3Cdata
on obtient une sortie de ce style
<body>
<form action="/phpself.php/"><script>alert('xss')</script><data">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
La partie « data » rajoutée sert à fermer le tag du form, d’une manière absolument pas conventionnelle ni même valide, mais c’est de cette manière que rien ne s’affiche à l’écran, sur le navigateur.
Il y a donc exécution de code Javascript malicieux par injection, avec tout ce que ca engendre ( vol de cookie entre autre, attaque CSRF )
Il est pourtant possible de se protéger, comme ceci :
<body>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
C’est d’ailleurs ce code là qui a permis de protéger phpinfo(), qui fait apparaitre PATH_INFO, et qui a un moment, était aussi vulnérable (PHP < 4.4.3)
3 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
J’ai testé tout ça, et dans mon cas, $_SERVER[‘PHP_SELF’] contient invariablement ‘/phpself.php’. Le contenu de $_SERVER[‘PATH_INFO’] n’est manifestement pas ajouté à $_SERVER[‘PHP_SELF’]. Pourtant, je tourne sur PHP 5.1.2, qui est sorti avant la publication de cet article.
Une idée?
je ne sais pas ce qu’il en est de REQUEST_URI, mais j’avais lu en tout cas qu’en utilisant SCRIPT_NAME, ce problème n’existait pas.
Bonjour,
Pensez-vous que le problème soit le même avec : $_SERVER[‘REQUEST_URI’] ?
Merci