Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927) 复现利用与原理分析

news2025/4/25 22:08:55

免责声明

本文所述漏洞复现方法仅供安全研究及授权测试使用;

任何个人/组织须在合法合规前提下实施,严禁用于非法目的;

作者不对任何滥用行为及后果负责,如发现新漏洞请及时联系厂商并遵循漏洞披露规则。


漏洞原理

Next.js 是一个基于 React 的流行 Web 应用框架,提供服务器端渲染、静态网站生成和集成路由系统等功能,它有自己的中间件(middleware)。当使用中间件进行身份验证和授权时,Next.js 14.2.25 和 15.2.3 之前的版本存在授权绕过漏洞。

该漏洞允许攻击者通过操作 x-middleware-subrequest 请求头来绕过基于中间件的安全控制,从而可能获得对受保护资源和敏感数据的未授权访问。

进一步的漏洞原理分析见后文。

影响版本

  • 对于 Next.js 15.x,version < 15.2.3
  • 对于 Next.js 14.x,version < 14.2.25
  • 对于 Next.js 13.x,version < 13.5.9
  • 对于 Next.js 12.x,version < 12.3.5

漏洞利用

一、FOFA

fofa语法:

app="next.js"

找一个真实的网站进行测试,如果不知道测试网站的什么路径,可以尝试先找进入就跳转登录界面的网站,尝试访问他的根路径或者/dashboard路径

二、漏洞利用

找到一个网站,直接访问根目录会重定向到登陆界面,直接访问注册功能也会重定向到登陆界面,未授权不允许注册

而加上x-middleware-subrequest头,并将Value设置为middleware:middleware:middleware:middleware:middleware之后,再次访问注册功能

成功绕过授权,访问到注册界面


漏洞复现

vulhub已有环境,也可以通过vulhub进行复现

一、环境搭建

  1. git clone https://github.com/vulhub/vulhub.git
  2. 进入到漏洞目录下cd /path/to/vulhub/next.js/CVE-2025-29927
  3. 执行命令启动一个基于 Next.js 15.2.2 的存在漏洞的应用:docker compose up -d
  4. 访问3000端口,可以看到环境搭建成功,输入默认凭据 admin:password,可以登录成功并访问仪表盘

二、漏洞复现

仪表盘在根路径下,如果在没有合法凭据的情况下直接访问根路径,将会被重定向到登录页面

在请求中添加 x-middleware-subrequest 请求头,其值为

  • middleware:middleware:middleware:middleware:middleware
  • src/middleware:src/middleware:src/middleware:src/middleware:src/middleware

成功绕过身份验证检查,注意右上角,与之前直接登录是有区别的,现在并不是 admin 的身份


漏洞原理深入分析

漏洞代码分析

(一) 旧版本代码 - 12.2之前

该框架的旧版本(v12.0.7)存在一段代码

  1. 当 next.js 应用程序使用中间件时,将使用runMiddleware函数
  2. runMiddleware函数会检索x-middleware-subrequest头的Value
    1. 使用Value来判断是否需要应用中间件
  1. 具体而言:x-middleware-subrequest头的Value被拆分并使用:作为分隔符创建一个列表
    1. 检查此列表是否包含middlewareInfo.name

这意味着,如果我们将有正确Value的x-middleware-subrequest头添加到请求中,中间件将被完全忽略,并且请求将通过转发NextResponse.next()并成功访问路径,而中间件不会对其产生任何影响。

为了成功未授权访问,x-middleware-subrequest的Value必须包含middlewareInfo.name,但它是什么呢?

1. middlewareInfo.name

middlewareInfo.name的值完全可以猜测,它只是中间件所在的路径。要知道这一点,有必要快速了解一下旧版本中中间件的配置方式。

首先,在版本 12.2之前,该文件必须命名为 _middleware.ts

此外,approuter 仅在 Next.js 版本 13 中发布。此前唯一存在的 router 就是 pages router ,因此该文件必须放在pages文件夹中(router specific)。

这些信息使我们能够推断出中间件的确切路径,从而猜测出x-middleware-subrequest头的值,后者仅由目录名称和文件名称组成,遵循当时的约定,以下划线开头:

x-middleware-subrequest: pages/_middleware

这样便可以完全绕过中间件,从而绕过任何基于它的保护系统

但还需要考虑执行顺序问题

2. 执行顺序

12.2 之前的版本允许嵌套路由将一个或多个_middleware文件放置在树中的任何位置(从pages文件夹开始),并且具有执行顺序

因此,要获得对/dashboard/panel/admin(受中间件保护的)的访问权限,关于middlewareInfo.name的值有三种可能性,因此 x-middleware-subrequest 的值也有三种可能性:

pages/_middleware
pages/dashboard/_middleware
pages/dashboard/panel/_middleware
(二) 新版本代码 - 12.2之后
1. Payload

从版本 12.2 开始,该文件不再包含下划线,而必须简单地命名为middleware.ts

此外,它不能再位于 pages 文件夹中

考虑到这一点,从版本 12.2 开始的第一个版本的有效Payload非常简单

x-middleware-subrequest: middleware
2. /src 目录

还应该考虑到 Next.js 提供了创建/src目录的可能性

除了在项目根目录中放置特殊的 Next.js 应用程序或页面目录外,Next.js 还支持将应用程序代码放置在 src 目录下的常见模式。Next.js文档

在这种情况下,有效Payload将是:

x-middleware-subrequest: src/middleware

因此,无论路径有多少层,总共只有两种可能性

(三) 新版本逻辑变动代码
1. 代码分析

在较新的版本(v15.1.7)中,逻辑又略有改变,看一下这段代码

常量depth的值必须大于或等于常量MAX_RECURSION_DEPTH的值 (即5

每当subrequests(即用:分隔的Value的列表)中的其中一个Value等于中间件路径即params.name时,常量depth就会加 1

params.name跟之前一样,只有两种可能性:middleware/src/middleware

因此,我们只需要在请求中添加以下标头/值即可绕过中间件:

x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

或者

x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware
2. 这段代码原本是用来做什么的?

这是为了防止递归请求陷入无限循环。

修复代码分析

漏洞已修复,分析一下官方修改了哪些内容

(一) 新增x-middleware-subrequest-id头

packages/next/src/server/lib/router-server.ts

packages/next/src/server/web/sandbox/context.ts

(二) 对x-middleware-subrequest-id进行校验

packages/next/src/server/lib/server-ipc/utils.ts

防御措施

升级到不受影响版本

  • CVE-2025-29927 - GitHub Advisory Database
  • Next.js and the corrupt middleware: the authorizing artifact
  • NVD - CVE-2025-29927
  • CVE 2025 29927 Nextjs Auth Bypass - chestnut’s blog
  • 漏洞通告 | Next.js middleware 权限绕过漏洞
  • Update middleware request header by ijjk · Pull Request #77201 · vercel/next.js
  • CVE-2025-29927 Next.js 中间件权限绕过漏洞复现 - CVE-柠檬i - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AOA与TOA混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用EKF

本代码实现了一个基于 到达角(AOA) 和 到达时间(TOA) 的混合定位算法,结合 扩展卡尔曼滤波(EKF) 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络,展示了从信号测量、定位解算到轨迹滤波的全流程,适用于城市峡谷、室内等复杂环境下的定位研究。 文…

C语言之数据结构:双向链表

个人主页&#xff1a;云纳星辰怀自在 座右铭&#xff1a;“所谓坚持&#xff0c;就是觉得还有希望&#xff01;” 前言 前文阐述了数据结构中单向链表的定义、分类和实际应用。本文将重点阐述带哨兵节点的双向循环链表。 1. 带头双向循环链表 带头双向循环链表 是一种特殊的链…

jdk21使用Vosk实现语音文字转换,免费的语音识别

1.下载vosk的model vosk官网&#xff1a;https://alphacephei.com/vosk/models 我这里使用较小的vosk-model-small-cn-0.22 2.添加相关pom文件 <!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…

I.MX6ULL 开发板上挂载NTFS格式 U 盘

I.MX6ULL 开发板上挂载NTFS格式 U 盘 挂载失败安装NTFS-3G安装失败成功安装 移植挂载成功卸载U盘 挂载失败 我使用的U盘的格式是NTFS格式的 插入U盘时会有信息 我使用的是闪迪的U盘&#xff0c;大小标称是 32G &#xff0c;实际能用的只有 28G 左右 可以使用lsblk命令查看磁盘…

性能测试~

1.什么是性能测试 1.什么是性能 就像这两个车一样,虽然都是代步工具,构造都是一样的,但是路虎的发动机要比捷达好.路虎的百米加速却是比捷达快的,我们就知道路虎的性能要比捷达好 . 那么什么是软件的性能呢?我们分析一下 2.常见的性能测试指标 2.1并发数 并发数是指在同一…

排查使用RestTemplate远程调用,@RequestBody注解接收不到实体类

做项目学习&#xff0c;使用RestTemplate远程调用&#xff0c;从order订单系统调用pay支付系统&#xff0c;出现使用Request做远程接收。 代码的逻辑很简单&#xff0c;但就是没有接收到实体类 1. 猜想是不是没有序列化和初始化方法&#xff1f; 这个好排查&#xff0c;看Pay和…

数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步

某些用户在使用数据库同步中间件PanguSync时说&#xff0c;我不想进行初次的全量同步&#xff0c;我已经源备份还原到目标库了&#xff0c;两边初始数据一样&#xff0c;想跳过初始数据&#xff0c;直接进行增量同步&#xff0c;该怎么设置。 直接上干货&#xff0c;按如下步骤…

qwen2.5vl技术报告解读

一. 首先qwen2.5vl模型特点 全能文档解析能力 升级文本识别至全场景文档解析,擅长处理多场景、多语种及复杂版式文档(含手写体、表格、图表、化学方程式、乐谱等),实现跨类型文档的精准解析。 跨格式精准目标定位 突破格式限制,大幅提升对象检测、坐标定位与数量统计精度,…

【Linux】进程的详讲(上)

目录 &#x1f4d6;1、冯诺依曼体系结构 &#x1f4d6;2、硬件介绍 &#x1f4d6;3、内存的重要性 &#x1f4d6;4、程序运行的步骤 &#x1f4d6;5、QQ聊天时的数据流动 &#x1f4d6;6、操作系统 &#x1f4d6;7、操作系统的目的 &#x1f4d6;8、操作系统是如何…

Pyside6 开发 使用Qt Designer

使用Qt Designer 在Scripts目录下打开pyside6-designer.exe 分别将姓名、年龄、爱好对应的输入框的ObjectName 设置为 uname、uage、ulike 提交按钮Object设置为 btnSubmit 点击保存文件 &#xff0c;命名为student.ui 将.ui文件编程成.py文件 pyside6-uic student.ui -o st…

PyQt6实例_批量下载pdf工具_使用pyinstaller与installForge打包成exe文件

目录 前置&#xff1a; 步骤&#xff1a; step one 准备好已开发完毕的项目代码 step two 安装pyinstaller step three 执行pyinstaller pdfdownload.py&#xff0c;获取初始.spec文件 step four 修改.spec文件&#xff0c;将data文件夹加入到打包程序中 step five 增加…

局域网共享失败?打印机/文件夹共享工具

很多时候&#xff0c;在办公或家庭环境中&#xff0c;我们需要进行打印机和文件夹的共享&#xff0c;以便更高效地协作和处理文件。然而&#xff0c;寻找对应版本的共享设置或是不想花费太多时间去进行复杂的电脑设置&#xff0c;总是让人感到头疼。今天&#xff0c;我要向大家…

DeepSeek-V3-250324: AI模型新突破,性能超越GPT-4.5

DeepSeek 于 3 月 25 日宣布完成 V3 模型的小版本升级&#xff0c;推出 DeepSeek-V3-250324 版本。新版本在推理能力、代码生成、中文写作及多模态任务上实现显著优化&#xff0c;尤其在数学和代码类评测中得分超越 GPT-4.5&#xff0c;引发行业高度关注。 DeepSeek-V3-250324…

第R9周:阿尔兹海默症诊断(优化特征选择版)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 1、导入数据2、数据处理2.1 患病占比2.2 相关性分析2.3 年龄与患病探究 3、特征选择4、构建数据集4.1 数据集划分与标准化4.2 构建加载 5、构建模型6…

19726 星际旅行

19726 星际旅行 ⭐️难度&#xff1a;困难 &#x1f31f;考点&#xff1a;Dijkstra、省赛、最短路问题、期望、2024 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static int N 1005;static ArrayList<Integer>[] g new ArrayList[N]; // …

DeepSeek大模型应用开发新模式

DeepSeek大模型应用全景技术架构 DeepSeek大模型 VS 主流大模型 DeepSeek大模型系统提示词 VS 主流大模型 DeepSeek大模型迭代版本 DeepSeek专业化模型分类 DeepSeek大模型部署所需显存资源 DeepSeek不同参数模型及应用场景 DeepSeek大模型安装部署技术选型

探索:如何构建一个自我的AI辅助的开发环境?

构建支持AI的开发辅助环境并实现全流程自动化&#xff0c;需要整合开发工具链、AI模型服务和自动化流水线。以下是分步实施指南&#xff0c;包含关键技术栈和架构设计&#xff1a; 一、开发环境基础架构 1. 工具链集成平台 #mermaid-svg-RFSaibQJwVEcW9fT {font-family:"…

华为eNSP-配置静态路由与静态路由备份

一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时&#xff0c;需要网络管理人员手工修改静态路由信息。相比于动态路由协议&#xff0c;静态路由无需频繁地交换各自的路由表&#xff0c;配置简单&#xff0c;比较适合…

时尚界正在试图用AI,创造更多冲击力

数字艺术正以深度融合的方式&#xff0c;在时尚、游戏、影视等行业实现跨界合作&#xff0c;催生了多样化的商业模式&#xff0c;为创作者和品牌带来更多机会&#xff0c;数字艺术更是突破了传统艺术的限制&#xff0c;以趣味触达用户&#xff0c;尤其吸引了年轻一代的消费群体…

ai画图comfyUI 精准定位gligen。允许指定图像中多个对象的位置和大小

基础功能下&#xff0c;outpainting是内容填充&#xff0c;拉近拉远镜头&#xff0c;自动填充旁边物体。嵌入模型也需要单独下载&#xff0c;演示完示例后推荐模型站有更直观效果介绍和用法。选中精确定位。看一眼坐标&#xff0c;直接默认出一张图。然后修改定位&#xff0c;和…