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

IDOR (Insecure Direct Object Reference)

كيف يكشف تغيير معرف في الطلب بيانات ليست لك لأن الخادم لا يتحقق من ملكيتها ولماذا إخفاء المعرف ليس الحل

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

IDOR يحدث لما يتيح التطبيق الوصول إلى كائن سجل أو ملف أو طلب عبر معرف ترسله أنت ولا يتحقق أن الكائن يخصك غير المعرف فتصل إلى كائن شخص آخر هو نوع من خلل التحكم بالوصول وهو منتشر جدا لأن كل صفحة تقريبا تقول اعرض لي الكائن رقم كذا

ما هي الثغرة؟

تفتح فاتورتك أنت:

طلبك أنت
GET /invoice?id=1050

الخادم يجلب الفاتورة 1050 ويعرضها لكن ماذا يحدث لو طلبت رقما آخر؟

طلب فاتورة غيرك
GET /invoice?id=1000

إذا أرجع الخادم الفاتورة 1000 بدون أن يتحقق أنها تخصك فأنت الآن تقرأ فاتورة شخص آخر المعرف مرجع مباشر للكائن واستخدامه غير آمن لأن لا شيء يصرح لك بهذا الكائن تحديدا

ليش تصير؟

المطور يفحص هل أنت مسجل دخول وينسى التصريح على مستوى الكائن هل يحق لك رؤية هذا الكائن بالذات الاستعلام db.record(id) يرجع أي سجل بسرور والسطر الناقص هو وهل هو سجلك المعرف يأتي من المستخدم فالمستخدم يقدر يغيره

إخفاء المعرف ليس الحل

حل خاطئ شائع هو جعل المعرف صعب التخمين ترميزه بـ Base64 أو تجزئته هذا الاعتماد على كون تفصيلة سرية أو صعبة الإيجاد بدل الاعتماد على فحص وصول حقيقي يؤخر المهاجم ولا يوقفه Base64 ليس تشفيرا أي أحد يفكه ويعيد ترميز معرف آخر وحتى المعرف العشوائي الذي لا يخمن يفشل لو سربه جزء آخر من التطبيق صفحة قائمة أو مسار إداري متروك مفتوحا الحل دائما هو نفسه: صرح بالكائن في الخادم

كيف تنحمى منها

safe.js
app.get('/invoice', (req, res) => {
  if (!req.session.user) return res.status(401).end();      // authentication
  const invoice = db.invoice(req.query.id);
  if (!invoice || invoice.ownerId !== req.session.user) {    // authorization (object level)
    return res.status(403).end();
  }
  res.json(invoice);
});

افحص الملكية على كل طلب كائن وتحقق من الأدوار على كل وظيفة ذات صلاحية وفضل مراجع مربوطة بالجلسة (اجلب فواتير المستخدم الحالي بدل أي فاتورة بالرقم) حتى لا يكون هناك معرف غريب تمرره أصلا المعرف العشوائي UUID إضافة معقولة لكنه ليس بديلا عن الفحص أبدا

سؤال مراجعةتطبيق بدل /record?id=1050 إلى /record?ref=MTA1MA== (ترميز Base64 للرقم 1050) ومازال يعرض أي سجل هل صار آمنا؟

اللابات

  • سجل برقم متسلسل

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

    اقرأ سجل الزعيم واحصل على رمز مخبئه رغم أنه ليس سجلك

  • مرجع يبدو عشوائيا

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

    اقرأ سجل الزعيم مرة أخرى رغم أن المرجع لم يعد رقما بسيطا

  • باب خلفي للمشرفين منسي

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

    اقرأ سجل الزعيم مرة أخرى رغم أن مرجعه UUID لا يخمن