27-10-2012, 10:41 AM
Le principe d'une faille XSML est le suivant (dans les grandes lignes):
- Tu es logé en tant qu'administrateur sur ton site machin.fr
- Sur ce site machin.fr, tu as des pages et des formulaires qui te permettre de modérer et d'administrer ton site (une page de suppression de compte, une pour éditer des commentaires etc)
- Comme tu es en admin sur machin.fr, si ton navigateur demande une page de machin.fr, alors machin.fr croira que tu es en admin et que tu visite la page
- si le développeur de truc.fr a inclut la page "supprimer_compte.php?compte_id=XXX" dans une page de truc.fr, et qu'il cachait le résultat de cette inclusion (il suffit de faire une frame non(affichée par exemple), alors machin.fr croira que tu demande la page supprimer_compte.php?compte_id=XXX" et donc, le compte d'identifiant XXX sera supprimé de machin.fr, car tu es loggé en tant qu'admin sur machin.fr
Utiliser "POST" en place de "GET" pour les types de formulaires ne changera pas grand chose.
Il existe des tas d'autres trucs qui peuvent être fait en cross domain (aka appeler et utiliser une page d'un domaine A=machin.fr alors qu'on se ballade sur une page du domaine B=truc.fr), mais celle-ci est la plus marquante.
Après, ca, c'est appelé "XSS", pas "XSML", mais je pense que ca doit revenir à la même chose.
Pour éviter ce genre de problème, généralement, on utilise un token: une valeur aléatoire dans un input hidden, valeur changée à chaque affichage de formulaire, et que se place dans le form d'origine. Cette valeur est stockée quelque part sur le serveur machin.fr. Ainsi, lorsque le serveur machin.fr reçoit un résultat de formulaire (ex: supprimer_compte.php?id=XXX) il vérifie d'abord que la token est également passée en paramlètre et qu'elle correspond à la valeur que le serveur avait envoyé.
Note que le XSS est la raison pour laquelle le champ "mot de passe" doit aprfois être rempli sur un site alors que tu es déjà loggé (par exemple, pour changer son pass, il faut entrer l'ancien pass: cela évite qu'un aller simple sur la page changer_pass.php?nouvea_pass=XXX ne te change ton pass: il faut également connaitre l'ancien pass et seul changer_pass.php?nouveau=XXX&ancien=YYY permettra de changer le mot de pass, or YYY est totalement inconnu de tous, sauf de la personne a qui appartient le compte).
- Tu es logé en tant qu'administrateur sur ton site machin.fr
- Sur ce site machin.fr, tu as des pages et des formulaires qui te permettre de modérer et d'administrer ton site (une page de suppression de compte, une pour éditer des commentaires etc)
- Comme tu es en admin sur machin.fr, si ton navigateur demande une page de machin.fr, alors machin.fr croira que tu es en admin et que tu visite la page
- si le développeur de truc.fr a inclut la page "supprimer_compte.php?compte_id=XXX" dans une page de truc.fr, et qu'il cachait le résultat de cette inclusion (il suffit de faire une frame non(affichée par exemple), alors machin.fr croira que tu demande la page supprimer_compte.php?compte_id=XXX" et donc, le compte d'identifiant XXX sera supprimé de machin.fr, car tu es loggé en tant qu'admin sur machin.fr
Utiliser "POST" en place de "GET" pour les types de formulaires ne changera pas grand chose.
Il existe des tas d'autres trucs qui peuvent être fait en cross domain (aka appeler et utiliser une page d'un domaine A=machin.fr alors qu'on se ballade sur une page du domaine B=truc.fr), mais celle-ci est la plus marquante.
Après, ca, c'est appelé "XSS", pas "XSML", mais je pense que ca doit revenir à la même chose.
Pour éviter ce genre de problème, généralement, on utilise un token: une valeur aléatoire dans un input hidden, valeur changée à chaque affichage de formulaire, et que se place dans le form d'origine. Cette valeur est stockée quelque part sur le serveur machin.fr. Ainsi, lorsque le serveur machin.fr reçoit un résultat de formulaire (ex: supprimer_compte.php?id=XXX) il vérifie d'abord que la token est également passée en paramlètre et qu'elle correspond à la valeur que le serveur avait envoyé.
Note que le XSS est la raison pour laquelle le champ "mot de passe" doit aprfois être rempli sur un site alors que tu es déjà loggé (par exemple, pour changer son pass, il faut entrer l'ancien pass: cela évite qu'un aller simple sur la page changer_pass.php?nouvea_pass=XXX ne te change ton pass: il faut également connaitre l'ancien pass et seul changer_pass.php?nouveau=XXX&ancien=YYY permettra de changer le mot de pass, or YYY est totalement inconnu de tous, sauf de la personne a qui appartient le compte).