Sean Coates relate sa découverte des XSS là où il l'attendait pas : dans $_SERVER["PHP_SELF"]. [imga]upload/php-logo.jpg[/imga] Les XSS consistent à injecter du code JavaScript dans une page, en faisant placer des données dans le code HTML par le script PHP. Le grand classique est
echo $_GET["x"];. qui injecte toute la variable x passée en méthode GET dans le code HTML. Il ne reste plus qu'à donner à x un peu de code Javascript, et le tour est joué.
Outre _GET, _POST et _COOKIE, il est recommandé de de pas utiliser _SERVER non plus. Sean vous explique pourquoi.
Pour en savoir plus : Faille XSS
Lu sur http://www.nexen.net
Après tests, cette faille fonctionnera que sur les serveurs ayant les magic_quotes_gpc = Off. Si elle sont à magic_quotes_gpc = On, ça ne marchera pas.
Bon, pour ceux qui ne pige pas grand à l'anglais, voici les explication simplifiés :
Si vous utiliser ce genre de code (page simple.php):
<html>
<body>
<?php
if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
echo "Form submitted!";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" />
</form>
</body>
</html>
Le code html de la page généré sera donc :
<html>
<body>
<form action="/tests/simple.php">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" />
</form>
</body>
</html>
Maintenant, changer l'url de cette façon :
http://www.example.com/simple.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo
Le code HTML de la page généré deviendrai :
<html>
<body>
<form action="/tests/simple.php/"><script>alert('xss')</script><foo">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" />
</form>
</body>
</html>
La solution ? :
<html>
<body>
<?php
if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
echo "Form submitted!";
}
?>
<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 vraiment une version simplifié, mais, je crois exact ;):