Auteur:
Jeremiah Grossman, www.witehatsec.com
1/20/2003
Traduction de l'anglais vers
le français :
Valdeux, www.phpecure.info ()
27/7/2003
Introduction
Le 23 octobre 2002,
Microsoft une nouvelle protection serveur/naviguateur, inclue
dans IE6 SP1. Baptisée httpOnly, son objectif est de préserver
les cookies du Cross Site Scripting (XSS). WhiteHat Security a
décidé d'analyser cette nouvelle fonctionnalité. Une
protection à l'encontre du XSS est tout d'abord une bonne chose.
Les codeurs Web dont nous faisont parti connaissent la
difficulté pour éviter ces failles.
Après de nombreux essais, j'ai déclaré sur bugtraq
(www.securityfocus.com) que la nouvelle fonctionnalité httpOnly,
bien que remplissant son rôle, se limite aux attaques XSS
classiques. Limitée par le fait qu'elle interdit simplement
l'acces aux données du cookie via l'objet
"document.cookie". Néanmoins, Microsoft a pris une
bonne initiative dans la lutte contre le XSS.
Une semaine après, l'équipe WhiteHat à découvert une nouvelle
technqiue d'attaque web qui permet non seulement de contourner la
protection httpOnly mais aussi d'injecter presque n'importe quel
XSS presque n'importe où. Cette technique utilise le langage de
script côté client JavaScript, mais pourrait aussi bien
utiliser VBScript, Flash, java, etc., et permet d'acceder aux
données d'authetification http, en faisant meme transiter ces
données via SSL. Cela n'avait jamais été possible jusque là.
Cette faille vous est exposée en detail dans les paragraphes
suivants.
Préambule Comme vous pouvez le constater
dans cette exemple, le serveur répond par les informations que
le client lui a envoyées. Voyons quelques sites ayant TRACE
activé : Option httpOnly Cookie Avec JavaScript on peut tester
la fiabilité de cette protection (testé avec IE6 SP1). En essayant ce code, on
constate vite qu'avec le paramètre httpOnly, l'objet
document.cookie renvoie une valeur nulle. C'est une amélioration
sécuritaire très utile pour de nombreuses applications web. Analyse Cependant, ce n'est pas une
mince affaire que d'envoyer une requête TRACE à partir
d'Internet Explorer, même à l'aide d'un FORM HTML (méthode =
POST). En fait, IE n'accepte que les méthodes GET et POST dans
un FORM. Pour outrepasser cette limitation, nous devons utiliser
des technologies avancées de scripting côté client afin de
créer et d'envoyer une requete HTTP forgée au serveur cible. De
nombreuses technologies le permettent. Le script ci-dessus, qui
utilise le contrôle ActiveX XMLHTTP, envoie une requete TRACE au
serveur. Si la méthode est activée, ce dernier nous renvoi
notre requête HTTP que l'on receptionne et affiche via
JavaScript. Les headers peuvent aussi contenir des informations
d'authentification. Cela démontre la capacité d'outrepasser la
protection "httpOnly" et de se passer de
document.cookie, même a travers une connexion SSL. Il est important de noter deux
choses : premièrement, l'envoi de requête TRACE n'est pas
limitée à IE, d'autres naviguateurs tels que Mozilla/Netscape
en sont capable. Par exmmple, dans Mozilla, on peut utiliser
l'objet XMLDOM. Deuxièmement, XMLHTTP n'est qu'un contrôle
parmi d'autres à posseder cette fonction. Il subsiste cependant un
facteur qui limite l'étendue du danger. La connection TRACE
effectuée par le browser est limitée au domaine ou se situe
notre script. Ainsi, un script hebergé sur http://foo.bar ne
pourra effectuer un TRACE que sur le domaine foo.bar. Néanmoins
cette restriction peut etre contournée comme nous allons le
voir. Pour amplifier l'étendue de
l'exploit, il faut utiliser une vulnérabilité de restriction de
domaine dans IE (ou le naviguateur de votre choix). Pour cela,
reférezà un forum tel que bugtraq. Récemment (relatif au
1/20/2003), une faille a été découverte dans les restrictions
de domaine d'IE. Ce defaut, découvert par GreyMagic Security,
étend la severité du problème.
Methode de requête
'TRACE'
"Trace" est simplement utilisé en tant
que procédure d'écho d'entrée de données pour le protocole
HTTP. Cette methode de requête est communément utilisée lors
de debugages et autres analyses de connection.
La requête "trace" (incluant requête, headers,
données à transmettre), envoyée à un serveur web compatible,
renverra au client les informations de la requete.
"Trace" fournit le moyen de savoir ce que le serveur
envoie et ce que le client reçoit. Apache, IIS et iPlmanet
supportent tous cette methode, telle qu'elle est définie dans la
RFC HTTP/1.1, et est par défaut activée. Très peu
d'administrateurs systèmes n'ont désactivée cette méthode,
soit parce qu'elle n'engendrait aucun risque connu, considerant
les paramètres par defaut satisfaisants, soit parce qu'ils
n'avaient pas le choix.
Ceci est un exemple de requete TRACE:
$ telnet foo.com 80
Trying 127.0.0.1...
Connected to foo.bar.
Escape character is '^]'.
TRACE / HTTP/1.1
Host: foo.bar
H-Header: test
HTTP/1.1 200 OK
Date: Mon, 02 dec 2002 19:24:51 GMT
Server: Apache/2.0.40 (Unix)
Content-Type: message/http
TRACE / HTTP/1.1
Host: foo.bar
H-Header: test
httpOnly est une option
qui informe les naviguateurs (seulement IE 6 lors de la création
de ce document) de ne pas autoriser les languages de scripts
(JavaScript, VBScript, etc.) à accéder à l'objet
"document.cookie" (cible courante des attaques XSS). La
sytaxe s'un httpOnly Cookie est: set-cookie: name=value; httpOnly
<script type="text/javascript">
<!--
function normalCookie() {
document.cookie = "TheCookieName=CookieValue_httpOnly";
alert(document.cookie);
}
function httpOnlyCookie() {
document.cookie = "TheCookieName=CookieValue_httpOnly; httpOnly";
alert(document.cookie);
}
//-->
</script>
<FORM>
<INPUT TYPE=BUTTON OnClick="normalCookie();"
VALUE='Display Normal Cookie'>
<INPUT TYPE=BUTTON OnClick="httpOnlyCookie();"
VALUE='Display HTTPONLY Cookie'>
</FORM>
Résultat du bouton "Display Normal Cookie"
Résultat du bouton "Display HTTPONLY Cookie"
Le premier objectif est
d'obtenir l'accès à la valeur du cookie, normalement accessible
via document.cookie, alors que httpOnly est activé. L'idée est
de trouver où cette valeur est située, ormis bien sûr
document.cookie. C'est ici que TRACE nous est utile pour
éclaircir le problème. TRACE renverra les informations que l'on
envoi dans une requete HTTP, ce qui inclue Cookie et
Authentification, puisque ce sont des headers HTTP.
<script
type="text/javascript">
<!--
function sendTrace() {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("TRACE",
"http://foo.bar",false);
xmlhttp.send();
xmlDoc=xmlHttp.responseText;
alert(xmlDoc);
}
//-->
</script>
<INPUT TYPE=BUTTON Onclick="sendTrace();" VALUE="Send Trace Request">
Résultat de la
requête TRACE, contenant entre autres le cookie du client.
Exploitation, exemples, sécurisation à venir dans la partie 2.