【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 | |
一、请求基本结构分析
这是一个标准的 HTTP/1.1 POST 请求,目标地址是localhost的根路径(/),核心特征如下:
- 请求方法:POST(用于提交数据,适合传输攻击载荷)
- Content-Type:
multipart/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 | |
关键恶意逻辑解析:
原型链污染(Prototype Pollution):
$1:__proto__:then:__proto__是 JavaScript 对象的原型链属性,$1表示引用name="1"的字段值("$@0",指向name="0"的内容),攻击者试图通过这种引用方式修改所有对象的原型链上的 then 方法,实现全局污染。$1:constructor:constructor:constructor是对象的构造函数,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;`});这段代码的目的是:
- 执行系统命令
id,获取当前进程的用户身份(如uid=0(root) gid=0(root)); - 将命令执行结果通过 Error 的
digest属性暴露出来(攻击者可通过返回值获取结果); - 抛出重定向错误,试图绕过应用的异常处理逻辑,确保命令执行完成。
- 执行系统命令
2. 辅助字段:name=”1” 和 name=”2”
name="1":值为"$@0",是攻击者定义的变量引用,指向name="0"的字段内容,用于串联原型链污染的引用关系。name="2":值为[](空数组),是攻击载荷的填充字段,可能用于触发目标应用的数组解析逻辑,辅助原型链污染生效。
三、攻击意图总结
这个 HTTP 请求是攻击者精心构造的针对 Node.js 应用的原型链污染 + RCE 攻击,核心目标:
- 通过原型链污染篡改应用的全局对象方法(如
then); - 利用污染后的原型链执行
child_process.execSync('id'),获取服务器的用户身份; - 若
id命令执行成功,攻击者会进一步尝试执行更危险的命令(如cat /etc/passwd、rm -rf /等),完全控制服务器。
四、什么是原型污染
说白了就是个所有类的基类添加一个方法,导致所有子类都继承了这个方法造成了污染
举个简单例子(Node.js/ 浏览器都适用):
1 | |
原型链污染就是攻击者通过修改对象的原型(__proto__),让所有继承这个原型的对象都被 “污染”—— 相当于篡改了 “公共模板”,所有用这个模板创建的对象都会带上被篡改的属性 / 方法。简单来说:正常情况下我们只改 “单个对象” 的属性,而原型链污染改的是 “所有对象的公共原型”,影响范围是全局的。
原型链污染核心触发条件(缺一不可)
原型链污染不是 Node.js 本身的 “原生漏洞”,而是开发者编写代码时的逻辑漏洞,只有满足以下场景才会出现:
- 场景 1:应用将用户可控的输入(如 POST 表单、JSON 参数、URL 查询参数)直接合并 / 赋值到对象中;
- 场景 2:合并 / 赋值逻辑未过滤敏感属性(
__proto__、constructor、prototype); - 场景 3:合并的目标对象是 “普通对象”(基于
Object.prototype创建),而非无原型对象(Object.create(null))。
2.漏洞原理
将上面的请求用bp发送,成功拿到RCE