Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-55182 — CVE-2025-55182 的概念验证漏洞利用,演示了 React Server Components 中通过 Server Actions 的不安全反序列化实现未认证远程代码执行(RCE),并附有详细的复现步骤和缓解指南。 | Kitploit
工具/GitHubGitHub/topstar88/cve-2025-55182
漏洞分析代码分析漏洞利用Web应用程序漏洞利用学习与教育Payload 开发
GitHubtopstar88/cve-2025-55182

CVE-2025-55182

CVE-2025-55182 的概念验证漏洞利用,演示了 React Server Components 中通过 Server Actions 的不安全反序列化实现未认证远程代码执行(RCE),并附有详细的复现步骤和缓解指南。

查看仓库
29个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-55182

本仓库包含 CVE-2025-55182 的 PoC 复现,这是 React Server Components (RSC) 中的一个严重安全漏洞,允许未认证的任意代码执行。

描述

该漏洞存在于 React Server Components 从客户端请求反序列化“Server Actions”的方式中。具体来说,requireModule 函数未能验证请求的导出名称是否为模块的直接属性。这允许攻击者访问导出函数的 constructor 属性,获取全局 Function 构造函数的引用,从而可用于执行任意代码。

复现

此 PoC 使用一个最小的 Node.js 环境来隔离 react-server-dom-webpack 库中的漏洞,以确保该利用程序展示的是库本身的缺陷,而不是框架中的错误配置。

前提条件

  • Node.js
  • npm

安装

root@kitploit:~
npm install

[!NOTE] package.json 固定指向存在漏洞的版本 19.0.0。

概念验证

  1. 启动存在漏洞的服务器

该脚本设置一个原始 HTTP 服务器,使用存在漏洞的 React 运行时来解码请求。

root@kitploit:~
# tty1
node --conditions react-server server.js
  1. 运行利用脚本

在另一个终端中,运行利用脚本。这会向服务器发送一个恶意的 Flight 载荷。

root@kitploit:~
# tty2
node exploit.js id

你应该会在响应中看到命令输出:

预期输出:

root@kitploit:~
Response: uid=0(root) gid=0(root) groups=0(root)

分析

为什么会出现这个漏洞?

ReactFlightDOMServerNode.js 中的 requireModule 函数基本上只是信任客户端发送的任何 name。它执行了 moduleExports[metadata[NAME]],而没有检查该属性是否真的应该被暴露。所以如果客户端说“兄弟,我想要这个属性”,服务器就会说“没问题!给你,老铁”。

为什么允许人们访问任意属性是个坏主意?

因为这基本上让任何人都能深入原型链,甚至是 constructor,这非常危险。如果模块恰好导出了一个函数(比如 module.exports = () => {}),那么它的 constructor 实际上就是全局的 Function 构造函数。

为什么获取 Function 构造函数就意味着 RCE?

一旦攻击者拿到 Function 构造函数,他们就可以滥用“Bound Server Action”功能。他们将包含恶意 JavaScript 的字符串绑定到它上面(基本上将其变成 new Function("evil code"))。一旦运行,服务器就会执行他们放入的任何代码。

为什么 React 会真的运行那个恶意函数?

因为 Server Actions 可以通过 ID 触发。如果攻击者构造一个 Action ID 指向他们的 module#constructor 引用的载荷,React 会像处理普通 action 一样解析并执行它。那个“action”实际上就是他们的恶意函数。

为什么这些都没有经过验证?

系统只是假设 Server Reference 元数据中的 id 和 name 总是指向开发者定义的有效导出。没有类似 hasOwnProperty 的安全检查来确保所请求的属性是真正的导出,而不是从原型链继承的东西。

为什么使用 server.js 而不是 Next.js?

我使用一个原始的 server.js(以及一个辅助文件 webpack-runtime.js)来手动配置 React Server Components 运行时。这使我们能够:

  1. 强制使用存在漏洞的配置: 只有在模块作为函数导出时(module.exports = fn),该利用才有效。真正的打包器可能会根据配置改变导出的包装方式,不过。
  2. 隔离缺陷: 这使我们能够证明问题出在 react-server-dom-webpack 内部,而不是 Next.js。
  3. 重建打包器环境: react-server-dom-webpack 假定它运行在 Webpack 打包环境中。我们的 webpack-runtime.js 为它提供了所期望的全局变量(__webpack_require__、__webpack_chunk_load__)。

这不是在模拟漏洞,只是为库提供实际运行所需的最低限度运行时。

备注

关于“无效 PoC”一直存在讨论,这些 PoC 只有在开发者故意暴露危险内容(如 child_process.exec)时才有效。

这个 PoC 不是其中之一。它在正常、安全的设置下即可工作。

  1. 暴露的函数是无害的 该应用暴露了一个简单的 updateProfile 函数,它只返回一个字符串,没有任何可疑之处,也没有 shell 命令。
  2. 利用完全绕过了该函数 该漏洞允许攻击者忽略安全导出,直接跳到 updateProfile.constructor,即全局 Function 构造函数。
  3. 核心问题是属性访问 React 本不应允许访问 .constructor。开发者并未打算暴露 Function 构造函数,而是不安全的反序列化替他们做到了这一点。

唯一真正的条件是模块直接导出一个函数(module.exports = fn),这在 CommonJS 和许多打包器设置中非常常见。

载荷

exploit.js 中的载荷构造了一个由三个数据块组成的 React Flight 消息:

  • 数据块 0: 指向数据块 1 中定义的 Server Reference。
  • 数据块 1: 声明 Server Reference:
    • id:"user-profile-action#constructor",意思是“把构造函数给我”。
    • bound:指向数据块 2,其中包含参数。
  • 数据块 2: ["console.log('nice try, diddy!')"]:恶意代码字符串。

当 React 反序列化它时:

  1. 它解析 user-profile-action。
  2. 读取 .constructor 属性 => 获得全局 Function。
  3. 将攻击者提供的字符串绑定到它。
  4. 实际执行: new Function("console.log('nice try, diddy!')")

这就是 RCE!

缓解措施

立即升级到已修补的版本:

  • react-server-dom-webpack >= 19.0.1
  • react-server-dom-parcel >= 19.0.1
  • react-server-dom-turbopack >= 19.0.1

该补丁引入了 hasOwnProperty 检查,以防止访问继承的属性,并限制 base64 文件上传。

如果你针对已修补的版本运行此 PoC,服务器将崩溃或报错,如下所示:

root@kitploit:~
$ node --conditions react-server server.js
Listening on http://localhost:3000
/path/to/CVE-2025-55182/node_modules/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js:2726
            resolvedValue = resolvedValue.bind.apply(
                                          ^

TypeError: Cannot read properties of undefined (reading 'bind')
    at /path/to/CVE-2025-55182/node_modules/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js:2726:43
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Node.js v20.19.3

这确认了利用程序无法访问 constructor 属性(它返回了 undefined 而不是 Function),因此后续的 .bind 调用失败。

免责声明

此代码仅用于教育和测试目的。请勿将本利用程序用于你不拥有或未经明确许可测试的系统。

许可证

根据 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 发布。

下载工具