حقن NoSQL
حين تدخل قيم JSON استعلام قاعدة المستندات كمعاملات فتتجاوز الدخول وتهزم قوائم حظر المعاملات وتسرب البيانات حرفا حرفا
- المسار
- أمن الويب
- الوقت المتوقع
- 25 د
- المستوى
- متوسط
قبل هذا الدرس
قواعد NoSQL مثل MongoDB تستعلم بكائنات منظمة لا بلغة نصية وهذا يزيل كسر الاقتباس الكلاسيكي في SQL لكنه يفتح بابا جديدا إذا دخلت قيم JSON من المستخدم فلتر الاستعلام بلا تحقق من النوع أرسل المهاجم كائن معامل مكان القيمة النصية المتوقعة وغير معنى الاستعلام
ما هي الثغرة؟
الدخول يبني فلتره من جسم الطلب مباشرة
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 ثم أدخلها
ادخل اللابمقفل
