writeup cookiefun
Voici un (tout) petit writeup d’un challenge de XSS organisé par .mario (du forum sla.cker entre autre, vous savez, les gus derrière la XSS Cheat Sheet)
Le challenge réside en l’écriture d’un XSS dans le contexte d’un document SVG sous firefox 3.6 à 4.
le xss se passe par le biais du paramètre ?xss= à la page (simple) et ressort dans le doc svg comme ceci :
http://heideri.ch/biscuit/?xss=%3Cscript%3Ealert(document.cookie)%3C/script%3E
qui nous ressort comme ceci :
<script>a?ert(?oc?ment.coo?ie)</script>
sauf que biensur, ça ne marche pas (hé sinon pas de challenge)on constate assez rapidement que u d k l v ”//” mais pas “/”…
et là c’est le drâme… c’est vrai, pas d’appel à eval() … *couic* ni de String.fromCharCode(), encore moins d’iframe avec en source le script externe (bah ouai, pas de http:// )
c’est là que deadbyte me fait remarquer que les majuscules passent :D, et c’est là qu’interviennent les 5 façons d’appeller une fonction javascript
donc on peut, à partir d’un objet, appeller sa méthode comme celà:
object['damethod']()
bon, nice, mais ça vaut pas un eval, hein ? il nous faut donc un objet qui possède la méthode eval(), et là, on à l’embaras du choix. puisque le script est lui même appelé dans un contexte objet, et que javascript est tout objet, eval peut s’appeller ainsi :
this.eval()
ou bien encore :
top.eval()
Et c’est là que toutes les techniques d’évasions possibles sur les chaînes de caractère interviennent…. ou pas :) en effet, en mattant la doc js, on découvre une fonction toLowerCase() qui à le mérite de passer le filtre (et ouai, L majuscule…).
on peut donc appeller eval() ainsi :
top['EVAL'.toLowerCase()]()
ce qui nous donne la solution suivante :
<script>top['EVAL'.toLowerCase()]('ALERT(DOCUMENT.COOKIE)'.toLowerCase())</script>
bon, on peut aussi écrire “eval” en remplaçant les caractères problématiques par leurs équivalents hexa : “e\x76a\x6c” comme dans la solution de Norman:
<frame src='jaVascript:this["e\x76a\x6c"]("a\x6cert(\x64oc\x75ment.coo\x6bie)")'/>une autre solution pour appeller le code javascript consiste à ouvrir une url de type javascript:alert() avec la fonction open() qui elle passe au travers des filtres, ce qui nous donne la solution de kyle :
<script>open(\"ja\\166ascript:a\\154ert(\\144oc\\165ment.coo\\153ie)\")</script>
bon, c’est bien joli tout ça, mais c’est loin d’être la meilleur solution… en effet, ne compte dans la taille du xss que les caractères qui sont transmis au serveur. Petit détail qui à son importance, et qui permet d’utiliser un trick très intéressant, le fameux # préconisé par google pour l’indexation des pages dynamiques…
<script>open(/[^z]*$/(top['\154ocation']))</script>#zjavascript:alert(document.cookie) //machaira9 and Phil
ici, l’utilisation d’une expression régulière permet de récupérer ce qu’il y à après le #z dans l’url, et de la passer comme argument à la fonction open() ce qui équivaut à un open("javascript:alert(document.cookie). Comme ce qu’il y à après le # ne passe pas par le serveur, le filtre ne s’y applique pas.
bon, et pour ceux qui n’ont pas décrochés, les solutions les plus violentes : http://heideri.ch/biscuit/results
happy hacking
Tags: XSS
























open(name)J’aime :D
Et pour le fun, la mienne.
http://heideri.ch/biscuit/?xss=%3Cscript%20src=%22Data:,a%256cert%28%2564oc%2575ment.coo%256bie%29%22/%3E