HTTP Response Splitting    Enregistrer au format PDF

Description et exploitation d’une XSS grâce à la faille HTTP Response Splitting.


par Podalirius , Ruulian

Brève explication de comment le cache fonctionne

Pour exploiter cette vulnérabilité nous devrons comprendre comment le cache fonctionne. Pour augmenter la vitesse de réponse, le cache stocke les réponses du serveur associées aux requêtes comme ceci :

/login => login page
/admin => admin page
/register => register page
/posts => posts page

Donc quand on fait une requête sur /posts par exemple, le cache nous envoie la réponse du serveur qui est associée à /posts stockée en cache.

Qu’est ce que la faille HTTP Response Splitting ?

La faille HTTP Response Splitting est un type de CRLF où le but est d’injecter une seconde réponse.

HTTP/1.1 302 FOUND
[...]
Set-Cookie: theme=dark
HTTP/1.1 200 OK
[...]

Ici, on a la réponse prévue par le serveur avec notre cookie dans les headers. Grâce à la présence d’une entrée utilisateur dans les headers, on peut exploiter une CRLF pour injecter non pas un nouvel header, mais une réponse toute entière !

Comment utiliser cette faille pour exploiter une XSS ?

En effectuant cette injection, il n’y a pas d’impact apparent dans notre navigateur mais on peut exploiter le cache. Après l’injection, la seconde réponse (la réponse injectée) n’est pas stockée dans le cache car elle n’a pas de requête associée, le cache va donc attendre quelques secondes de recevoir une requête à laquelle accrocher cette réponse "célibataire".

Ce qui signifie que si on fait une requête juste après l’injection, cette requête va être associée à la réponse injectée et quand d’autres utilisateurs vont GET cette url, ils vont recevoir la réponse injectée. Maintenant nous avons juste à ajouter du code Javascript dans le contenu de notre réponse injectée.

Exploit

Premièrement, nous devons vider le cache pour supprimer toutes les réponses associées aux requêtes ou nous ne serons pas en capacité de les modifier. Deuxièmement, nous devons effectuer notre injection. Enfin, on doit faire une requête sur la page dont qu’on souhaite associer à notre réponse.

Voici un pseudo-code pour réussir notre exploit :

# Requête sur la page à exploiter pour vider le cache
# Requête contenant notre injection
# Requête sur la page à exploiter pour associer cette requête à la réponse qui attend en cache

Comment savoir si l’exploit a réussi

Pour savoir si l’exploit a réussi il suffit de regarder le contenu de la page à exploiter, si le contenu affiché est le code Javascript injecté alors l’exploit a fonctionné, si à l’inverse le contenu de la page est le même que celui prévu initialement on est bon pour revoir notre exploit.

Références

Documentations publiées dans cette rubrique