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
 

 Un article de doctorrock   
					
 
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