تخط إلى المحتوى
English

حقن NoSQL

حين تدخل قيم JSON استعلام قاعدة المستندات كمعاملات فتتجاوز الدخول وتهزم قوائم حظر المعاملات وتسرب البيانات حرفا حرفا

المسار
أمن الويب
الوقت المتوقع
25 د
المستوى
متوسط
تقدمك في المسار0%

قواعد NoSQL مثل MongoDB تستعلم بكائنات منظمة لا بلغة نصية وهذا يزيل كسر الاقتباس الكلاسيكي في SQL لكنه يفتح بابا جديدا إذا دخلت قيم JSON من المستخدم فلتر الاستعلام بلا تحقق من النوع أرسل المهاجم كائن معامل مكان القيمة النصية المتوقعة وغير معنى الاستعلام

ما هي الثغرة؟

الدخول يبني فلتره من جسم الطلب مباشرة

login.js
const user = db.users.findOne({ username: req.body.username, password: req.body.password });

لو وصلت password كنص قورنت بالتساوي لكن لو أرسل العميل كائن معامل ne يطابق أي كلمة مرور فيتجاوز الدخول دون معرفة أي سر

لماذا تحدث؟

التطبيق افترض أن كل قيمة JSON نص لكن JSON يحمل كائنات أيضا وطبقة الاستعلام تعامل المفتاح الذي يبدأ بالدولار كمعامل ومحاولة الإصلاح بمنع ne قائمة سوداء تبقى gt و in و regex والأخير يحول رد نعم أو لا إلى أوراكل يسرب القيمة المخزنة حرفا حرفا

كيف تتوقف؟

تحقق من نوع كل قيمة قبل وصولها للاستعلام بيانات الدخول نص لا كائن وقارن كلمات المرور بتجزئة مخزنة لا بقيمة حية ولا تطارد المعاملات واحدا واحدا بل ارفض الشكل الخاطئ من أصله

اللابات الثلاثة أدناه هي هذا السلم تجاوز دخول بمعامل وقائمة حظر ne تهزمها gt واستخراج أعمى بـ regex لكلمة مرور admin

اللابات

  • تجاوز الدخول بمعامل

    سهللاب في المتصفح

    ادخل كـ admin دون معرفة كلمة مروره بمعامل NoSQL

  • قائمة سوداء للمعاملات

    متوسطلاب في المتصفح

    ادخل كـ admin بمعامل آخر غير ne

  • استخراج أعمى بـ regex

    صعبلاب في المتصفح

    استخرج كلمة مرور admin كاملة بـ regex ثم أدخلها