IDOR (Insecure Direct Object Reference)
كيف يكشف تغيير معرف في الطلب بيانات ليست لك لأن الخادم لا يتحقق من ملكيتها ولماذا إخفاء المعرف ليس الحل
- المسار
- أمن الويب
- الوقت المتوقع
- 20 د
- المستوى
- مبتدئ
قبل هذا الدرس
IDOR يحدث لما يتيح التطبيق الوصول إلى كائن سجل أو ملف أو طلب عبر معرف ترسله أنت ولا يتحقق أن الكائن يخصك غير المعرف فتصل إلى كائن شخص آخر هو نوع من خلل التحكم بالوصول وهو منتشر جدا لأن كل صفحة تقريبا تقول اعرض لي الكائن رقم كذا
ما هي الثغرة؟
تفتح فاتورتك أنت:
GET /invoice?id=1050الخادم يجلب الفاتورة 1050 ويعرضها لكن ماذا يحدث لو طلبت رقما آخر؟
GET /invoice?id=1000إذا أرجع الخادم الفاتورة 1000 بدون أن يتحقق أنها تخصك فأنت الآن تقرأ فاتورة شخص آخر المعرف مرجع مباشر للكائن واستخدامه غير آمن لأن لا شيء يصرح لك بهذا الكائن تحديدا
ليش تصير؟
المطور يفحص هل أنت مسجل دخول وينسى التصريح على مستوى الكائن هل يحق لك رؤية هذا الكائن بالذات
الاستعلام db.record(id) يرجع أي سجل بسرور والسطر الناقص هو وهل هو سجلك
المعرف يأتي من المستخدم فالمستخدم يقدر يغيره
إخفاء المعرف ليس الحل
حل خاطئ شائع هو جعل المعرف صعب التخمين ترميزه بـ Base64 أو تجزئته هذا الاعتماد على كون تفصيلة سرية أو صعبة الإيجاد بدل الاعتماد على فحص وصول حقيقي يؤخر المهاجم ولا يوقفه Base64 ليس تشفيرا أي أحد يفكه ويعيد ترميز معرف آخر وحتى المعرف العشوائي الذي لا يخمن يفشل لو سربه جزء آخر من التطبيق صفحة قائمة أو مسار إداري متروك مفتوحا الحل دائما هو نفسه: صرح بالكائن في الخادم
كيف تنحمى منها
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 إضافة معقولة لكنه ليس بديلا عن الفحص أبدا
اللابات
سجل برقم متسلسل
محلولسهللاب في المتصفح
اقرأ سجل الزعيم واحصل على رمز مخبئه رغم أنه ليس سجلك
ادخل اللابمقفلمرجع يبدو عشوائيا
محلولمتوسطلاب في المتصفح
اقرأ سجل الزعيم مرة أخرى رغم أن المرجع لم يعد رقما بسيطا
ادخل اللابمقفلباب خلفي للمشرفين منسي
محلولصعبلاب في المتصفح
اقرأ سجل الزعيم مرة أخرى رغم أن مرجعه UUID لا يخمن
ادخل اللابمقفل
