در حال بارگذاری...
بررسی آسیبپذیری ارجاع مستقیم شیء ناامن (IDOR) که به مهاجم اجازه میدهد با تغییر شناسه به منابع دیگران دسترسی پیدا کند.
اهداف این درس
ارجاع مستقیم شیء ناامن (Insecure Direct Object Reference یا IDOR) زمانی رخ میدهد که برنامه وب از شناسه کاربر (مثل ID، نام فایل یا کلید پایگاه داده) مستقیماً برای دسترسی به منابع استفاده کند بدون بررسی اینکه آیا کاربر مجاز به دسترسی به آن منبع است.
زمانی که برنامه از شناسه داخلی یک شیء (مثل ID رکورد پایگاه داده) مستقیماً در URL یا پارامتر استفاده میکند.
آسیبپذیریای که در آن مهاجم میتواند با تغییر شناسه به منابع دیگران دسترسی پیدا کند زیرا برنامه مالکیت منبع را بررسی نمیکند.
IDOR یکی از رایجترین آسیبپذیریها در برنامههای وب و API است. طبق OWASP، نقض کنترل دسترسی (که IDOR بخشی از آن است) سالهاست که در صدر آسیبپذیریهای وب قرار دارد. IDOR میتواند منجر به دسترسی غیرمجاز به اطلاعات حساس کاربران شود.
خطر بالا
IDOR میتواند منجر به نقض گسترده حریم خصوصی شود. در مواردی، مهاجم میتواند به اطلاعات میلیونها کاربر دسترسی پیدا کند.
تمام نقاطی که از شناسه برای دسترسی به منابع استفاده میکنند شناسایی کنید:
| نوع شناسه | مثال | خطر |
|---|---|---|
| عدد متوالی | /api/user/123 | بسیار بالا |
| UUID | /api/user/550e8400-e29b-41d4-a716-446655440000 | متوسط |
| نام کاربری | /api/user/johndoe | بالا |
| ایمیل | /api/user/john@example.com | بالا |
| توکن | /api/user/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | کم |
| ترکیبی | /api/user/123-orders-456 | بالا |
شناسهها را تغییر دهید و بررسی کنید آیا به منابع دیگران دسترسی پیدا میکنید:
1# تست با ID متوالی2curl "https://target.com/api/user/1" -H "Cookie: session=user_123"3curl "https://target.com/api/user/2" -H "Cookie: session=user_123"4curl "https://target.com/api/user/3" -H "Cookie: session=user_123"56# تست با پارامتر7curl "https://target.com/api/orders?user_id=456" -H "Cookie: session=user_123"89# تست با UUID10curl "https://target.com/api/user/550e8400-e29b-41d4-a716-446655440000" \11 -H "Cookie: session=user_123"1213# تست با نام فایل14curl "https://target.com/documents/report_user456.pdf" -H "Cookie: session=user_123"1516# تست با شناسه ترکیبی17curl "https://target.com/api/invoice/2024-001-456" -H "Cookie: session=user_123"IDOR را در تمام عملیات CRUD تست کنید:
شناسههای غیرمنتظره و نامعتبر را تست کنید:
1# تست با مقدار منفی2curl "https://target.com/api/user/-1"34# تست با مقدار صفر5curl "https://target.com/api/user/0"67# تست با مقدار بسیار بزرگ8curl "https://target.com/api/user/999999999"910# تست با رشته11curl "https://target.com/api/user/admin"1213# تست با SQL Injection14curl "https://target.com/api/user/1 OR 1=1"1516# تست با array17curl "https://target.com/api/user/[1,2,3]"IDOR میتواند منجر به دسترسی غیرمجاز به اطلاعات حساس کاربران، تغییر یا حذف دادهها، نقض حریم خصوصی، و سرقت هویت شود.
1import uuid23# استفاده از UUID4class User(models.Model):5 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)6 username = models.CharField(max_length=100)78# بررسی مالکیت9def get_order(request, order_id):10 order = get_object_or_404(Order, id=order_id)11 12 # بررسی مالکیت13 if order.user != request.user:14 return Response(status=403)15 16 return Response(order.data)1718# استفاده از indirect reference19def get_document(request, doc_ref):20 # تبدیل شناسه خارجی به داخلی21 internal_id = request.user.document_mapping.get(doc_ref)22 if not internal_id:23 return Response(status=404)24 25 document = get_object_or_404(Document, id=internal_id)26 return Response(document.data)توصیه عملی
همیشه مالکیت منبع را در سمت سرور بررسی کنید. از UUID استفاده کنید اما به آن اعتماد نکنید. بررسی مالکیت ضروری است حتی اگر از UUID استفاده میکنید.
هرگز از شناسه کاربر مستقیماً برای دسترسی به منابع استفاده نکنید.
مالکیت منبع را در سمت سرور بررسی کنید.
از UUID به جای ID متوالی استفاده کنید.
IDOR یکی از رایجترین آسیبپذیریهای API است.
کدام مثال نمونهای از IDOR است؟
IDOR چیست و چگونه رخ میدهد؟
IDOR (Insecure Direct Object Reference) زمانی رخ میدهد که برنامه از شناسه کاربر (مثل ID) مستقیماً برای دسترسی به منابع استفاده کند بدون بررسی اینکه آیا کاربر مالک آن منبع است. مهاجم میتواند با تغییر شناسه به منابع دیگران دسترسی پیدا کند.
چگونه از IDOR جلوگیری کنیم؟
راههای جلوگیری شامل: بررسی مالکیت منبع در سمت سرور، استفاده از UUID به جای ID متوالی، استفاده از indirect reference (مثل mapping)، و عدم نمایش شناسههای داخلی به کاربر.
آیا IDOR فقط در API مهم است؟
خیر، IDOR در تمام بخشهای برنامه شامل URL، فرمها، API و حتی فایلها ممکن است رخ دهد. اما در API به دلیل استفاده زیاد از شناسهها، بسیار رایج است.